我已经讨论了一段时间了,希望你能帮助我。
我一直在使用故事板创建一个应用程序,我有一个点,我弹出一个模式框来添加一个新记录,弹出窗口工作正常,问题是解雇它。
我遵循了Apple关于如何使用委托来正确关闭模态框的说明,并且工作正常,除了我需要在我的模态框中添加导航控制器,因为添加过程需要两个步骤(这里fullscreen }):
问题在于设置委托,所以这是我的两个问题:
1-在我的根视图中,类(My Tab)是Add类(模态)的委托,除此之外,所有内容都设置正确:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showAdd"]) {
[[segue destinationViewController] setDelegate:self];
}
}
问题在于[segue destinationViewController]正在返回navigationcontroller而不是AddDrinkViewController类(请参阅故事板)。我该如何解决这个问题?如果我完全删除导航控制器,代码可以正常设置适当的委托。
2-有没有办法通过拖动故事板中的插座来设置代理?
谢谢!
答案 0 :(得分: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中设置代表的方法。
答案 1 :(得分:9)
我发现我的情况更短(与你的相同):
AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0];
答案 2 :(得分:4)
基本上你需要创建一个
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;
}
}