如何设置故事板的代表

我一直在辩论这一段时间,希望你能帮助我。

我已经创build了一个应用程序大多使用故事板,我有一个点,我popup一个模式框添加一个新的logging,popup工作正常,问题是解雇它。

我遵循苹果公司的指示,如何正确closures使用代表模式框,并且工作正常,除了我需要添加一个导航控制器到我的模式框,因为添加过程需要两个步骤(这里全屏 ):

在这里输入图像说明

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

1-在我的根视图类(我的选项卡)是添加类(模式)的代表,一切都设置正确的除了这个:

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

问题在于[segue destinationViewController]正在返回导航控制器,而不是AddDrinkViewController类(请参阅故事板)。 我如何解决这个问题? 如果我完全删除导航控制器,代码工作正常设置适当的代表。

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

谢谢!

你是对的,在这种情况下, 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中设置委托的方法。

我发现了一个更短的方式(和你的一样):

 AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0]; 

基本上你需要创build一个
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; } }