使用 showDetailViewController 时 UISplitViewController 崩溃

UISplitViewController crashes when using showDetailViewController

在我的主视图中,我有 4 个静态 table 行。其中 2 行向下钻取到主视图中的详细视图,另外 2 行替换详细视图的内容。我通过适当地调用 showViewController() 和 showDetailViewController() 函数来控制 didSelectRowAtIndexPath() 方法发生的情况:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        Master2TVC *m2tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"master-2"];
        [self showViewController:m2tvc sender:self];
    } else if (indexPath.row == 1) {
        Master3TVC *m3tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"master-3"];
        [self showViewController:m3tvc sender:self];
    } else if (indexPath.row == 2) {
        Detail2VC *d2vc = [self.storyboard instantiateViewControllerWithIdentifier:@"detail-2"];
        [self showDetailViewController:d2vc sender:self];
    } else if (indexPath.row == 3) {
        Detail3VC *d3vc = [self.storyboard instantiateViewControllerWithIdentifier:@"detail-3"];
        [self showDetailViewController:d3vc sender:self];
    }
}

Master-Detail 模板的模板创建从主视图到详细视图的引用:

self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];

如果我没理解错的话,这个引用的存在是为了让主端可以向细节端发送消息。在我的例子中,我的详细视图的 class 将发生变化(Detail3VC、Detail2VC 等),所以我决定删除这一行并以另一种方式进行消息传递;但是,现在当我加载任何新的详细视图并更改 iPad 的旋转时,应用程序有时会因错误 EXC_BAD_ACCESS.

而崩溃

据我了解,EXC_BAD_ACCESS 通常意味着有一个不应该挂在某处的物体。我一直无法在 Apple 文档中找到任何关于在使用 showDetailViewController() 调用时必须更改任何其他内容的内容。事实上,我认为使用 showDetailViewController() 的原因是让 splitViewController 管理所有细节,而您不必在自己的 classes.

任何人都可以看到这里的错误吗?

我已经确认你遇到的崩溃。更改 iPad 的旋转时总是会发生这种情况。
无论如何,似乎我们需要实现 -targetDisplayModeForActionInSplitViewController: of UISplitViewControllerDelegate 和 return 除 UISplitViewControllerDisplayModeAutomatic.

之外的任何值
- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc {
    return UISplitViewControllerDisplayModePrimaryOverlay;
}