7

我正在尝试使用 UISplitViewController 和情节提要组合一个 iPad 应用程序。主视图从一个导航控制器开始,该控制器链接到一个包含 6 个菜单选项的表格视图。表格中的每个单元格都将不同的表格视图控制器推送到导航堆栈上。这对于主视图工作正常。每个主视图都有一个表格列表,单击该列表时需要在详细信息窗格中显示不同的视图控制器。我目前已经使用设置为“替换”和“详细信息拆分”的 segue 来完成此操作,这在第一次单击一行时起作用,但是一旦您单击主视图中的另一行或旋转设备,应用程序就会崩溃使用 EXC_BAD_ACCESS。

我相当确定我的问题与如何为 UISplitViewController 设置委托有关。当我有多个主 VC 和多个详细 VC 时,我对如何使用它感到困惑。委托代码应该放在哪里 - 主代码还是详细信息?我是否必须在每个视图控制器中实现 UISplitViewControllerDelegate 协议事件?

任何帮助表示赞赏。

4

1 回答 1

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 细节的任何视图控制器都可能需要成为委托。您可能希望将它们全部基于处理共享拆分视图控制器委托逻辑的通用超类。

于 2012-05-14T04:10:19.197 回答