如何使用故事板设置委托

19

我已经思考了一段时间,希望你能帮助我。

我正在使用storyboard创建一个应用程序,我有一个弹出模态框来添加新记录的地方,弹出框可以正常工作,问题在于如何关闭它。

我遵循了苹果关于如何正确关闭模态框的指示,这也正常工作,但是我需要给我的模态框添加导航控制器,因为添加过程需要两个步骤(在这里查看 全屏):

enter image description here

问题在于设置委托,所以我的两个问题是:

1- 在我的根视图类(My Tab)中,Add类(模态框)的委托已设置好,除了这个:

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

    }
}
问题在于[segue destinationViewController]返回的是导航控制器而不是AddDrinkViewController类(请参阅storyboard)。我该如何解决?如果完全删除导航控制器,代码可以正常工作并设置适当的委托。2-是否有办法通过在故事板中拖动outlets来设置委托?谢谢!

我一直在到处寻找如何设置模态的代理。非常感谢您提供的代码。哈哈 - matcha
3个回答

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

现在你可以在任何一个prepareForSegue方法中这样做,而不必担心是否存在NavigationController

[[segue topLevelDestinationViewController] setDelegate:self]
// another example:
MyViewController *vc = segue.topLevelDestinationViewController;
vc.delegate = self; // etc.
回答你的第二个问题,我找不到在IB中设置委托的方法。

9
我发现在我的情况下有一种更短的方法(和你的一样):
AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0];

1
太棒了!像魔法一样解决了我的问题! - iDroid
完美,也解决了我的问题。之前不明白为什么可以引用使用相同导航控制器的其他视图控制器的属性,但不能引用使用另一个导航控制器的属性。终于解决了! - Matthew Frederick

5

基本上,您需要创建一个UINavigationController实例并将destinationViewController分配给它,然后获取其topViewController。

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

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

    addDrinkcontroller.delegate = self;

   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接