我正在尝试使用UISplitViewController和故事板组合一个iPad应用程序。主视图以链接到6个菜单选项的表视图的导航控制器开始。表中的每个单元格将不同的表视图控制器推送到导航堆栈。这适用于主视图。每个主视图都有一个表列表,单击该列表时需要在详细信息窗格中显示不同的视图控制器。我目前使用segue设置为'Replace'和'Detail Split'来完成此操作,第一次单击一行时可以正常工作,但只要在主视图中单击另一行,或者旋转设备,应用程序就会崩溃使用EXC_BAD_ACCESS。
我很确定我的问题与如何为UISplitViewController设置委托有关。当我有多个主VC和多个细节VC时,我很困惑如何使用它。代理代码应该放在哪里 - 主人或详细信息?我是否必须在每个视图控制器中实现UISplitViewControllerDelegate协议事件?
任何帮助表示感谢。
答案 0 :(得分:16)
如果拆分视图控制器委托是已替换的详细视图控制器,则这是导致崩溃的原因。替换的详细信息视图控制器正在被释放,因此拆分视图控制器委托不再是对有效对象的引用。
您可以在prepareForSegue:sender:中更新委托。例如:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"MySegue"]) {
UIViewController *destinationViewController = [segue destinationViewController];
if ([destinationViewController conformsToProtocol:@protocol(UISplitViewControllerDelegate)]) {
self.splitViewController.delegate = destinationViewController;
}
else {
self.splitViewController.delegate = nil;
}
}
}
您用于代理的视图控制器取决于您的视图控制器层次结构。在最简单的情况下,分配给splitVC详细信息的任何视图控制器可能都需要是委托。您可能希望将它们全部基于处理共享拆分视图控制器委托逻辑的公共超类。