如何使用故事板设置委托

and*_*max 19 objective-c storyboard ios

我已经讨论了一段时间了,希望你能帮助我.

我一直在使用故事板创建一个应用程序,我有一个点,我弹出一个模态框添加一个新的记录,弹出工作正常,问题是解雇它.

我已经按照Apple的说明如何使用委托来正确关闭模态框,并且工作正常,除了我需要在我的模态框中添加导航控制器,因为添加过程需要两个步骤(这里是全屏):

在此输入图像描述

问题在于设置代表,所以这是我的两个问题:

1-在我的根视图中,类(我的选项卡)是Add类(模态)的委托,除此之外,所有内容都设置正确:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showAdd"]) {
        [[segue destinationViewController] setDelegate:self];

    }
}
Run Code Online (Sandbox Code Playgroud)

问题在于[segue destinationViewController]正在返回navigationcontroller而不是AddDrinkViewController类(参见故事板).我该如何解决这个问题?如果我完全删除导航控制器,代码可以正常设置适当的委托.

2-有没有办法通过拖动故事板中的插座来设置代理?

谢谢!

Mik*_*ock 13

你是对的,在这种情况下destinationViewController将是一个UINavigationController.我写了一个类别来处理这种常见情况:

// category .h file
@interface UIStoryboardSegue (NavControllerExtensions)
// Gets destinationViewCotroller. But if that controller 
// is a NavigationController, returns the nav controller's 
// top level view controller instead.
@property (readonly) id topLevelDestinationViewController;
@end

// category .m file
@implementation UIStoryboardSegue (NavControllerExtensions)
- (id)topLevelDestinationViewController
{
  id dest = self.destinationViewController;
  if ([dest isKindOfClass:[UINavigationController class]]) {
    UINavigationController* nav = dest;
    dest = nav.topViewController;
  }
  return dest;
}
@end
Run Code Online (Sandbox Code Playgroud)

所以现在您可以在任何prepareForSegue方法中执行此操作,而不必担心是否存在NavigationController:

[[segue topLevelDestinationViewController] setDelegate:self]
// another example:
MyViewController *vc = segue.topLevelDestinationViewController;
vc.delegate = self; // etc.
Run Code Online (Sandbox Code Playgroud)

为了回答你的第二个问题,我找不到在IB中设置代表的方法.


mud*_*lee 9

在我的案例中我找到了一个更短的方式(和你的一样):

AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)


bha*_*ari 5

基本上,您需要创建一个
UINavigationController 实例并将 destinationViewController 分配给它
并获取它的 topView 控制器

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showAdd"]) {

    UINavigationController *navigationController = segue.destinationViewController;
    AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController;

    addDrinkcontroller.delegate = self;

   }
}
Run Code Online (Sandbox Code Playgroud)