UISplitViewController:在 iPhone 6 Plus 上旋转时崩溃

UISplitViewController: Crash on rotating on iPhone 6 Plus

我在 iOS 8 上使用 UISplitViewController 时遇到问题。

特别是在旋转屏幕时崩溃,这只发生在 iPhone 6 Plus 上。我假设它发生在控制器尝试 split/merge 视图控制器时。

我的导航堆栈可能有点复杂,拆分视图的左侧和右侧都有一个 UINavigationController。在切换到右堆栈之前,可以将多个项目压入左堆栈。它与默认的邮件应用程序非常相似。在您选择邮箱的位置,打开文件夹并浏览左侧堆栈中的邮件列表,并在右侧堆栈中显示邮件和打开附件等。

我能够配置和连接不同视图的行为方式,只使用故事板配置,方法是使用 Show (e.g. Push) 推入左侧堆栈和 Show Detail (e.g. Replace)

四处点击(并填充右侧堆栈)后,在 iphone 6 plus 上旋转将使应用程序崩溃。我意识到它会发生,因为这是唯一将两侧相互扩展和折叠的设备。调试器没有给出真正的信息,我 有时 得到的唯一信息是:

-[UIView updateNavigationBarButtonsAnimated:]: unrecognized selector sent to instance

注意它说 UIView 的地方,这似乎是随机的(NFCString、NSArray 等),所以我认为它出乎意料地为 nil 并指向堆上的随机代码。

我也意识到这与 UISplitViewControllerDelegate 方法有关,但我就是想不通我应该怎么做才能让它发挥作用。

"I also realise this has something to do with the UISplitViewControllerDelegate methods, but I just cannot figure out what I should really do to make it work."

你是对的。我有同样的问题并解决这个问题:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.isMovingFromParentViewController) {
        // To avoid deallocated problem with SplitVC delegates
        self.splitViewController.delegate = nil;
        // Do your stuff here
    }
}

换句话说,当屏幕消失时,你必须将splitViewController的delegate赋值给nil。

希望这对你和我一样有帮助。

我遇到了同样的问题。
我的崩溃是由于在 UISplitViewController 的子类中的 viewDidLoad 中设置了 leftBarButtonItem 引起的。我删除了这两行代码。

let navigationController = self.viewControllers[self.viewControllers.count-1] as! UINavigationController
navigationController.topViewController.navigationItem.leftBarButtonItem = displayModeButtonItem()

现在我在 prepareForSegue 中设置了 leftBarButtonItem。这就是 Apple 在 Master/Detail 示例中的做法 ;-)