UISplitViewController:iPhone 6 Plus旋转时崩溃

3

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

具体来说,当旋转屏幕时,iPhone 6 Plus会崩溃。我认为是控制器尝试拆分/合并视图控制器造成的。

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

我能够仅使用故事板配置来配置和连接不同视图的行为,通过使用“显示(例如推送)”将其推入左侧堆栈和“显示详细信息(例如替换)”。

点击一些按钮后(并填充右侧堆栈),在iPhone 6 Plus上旋转屏幕就会使应用程序崩溃。我意识到这是唯一会使两侧相互扩展和折叠的设备。调试器没有给出任何真正的信息,我只能偶尔得到以下消息:

- [UIView updateNavigationBarButtonsAnimated:]:向实例发送未识别的选择器

请注意,其中提到了UIView,这似乎是随机的(NFCString,NSArray等),因此我认为它出现nil并指向堆上的随机代码。

我也意识到这与UISplitViewControllerDelegate方法有关,但我无法弄清楚应该做什么才能使其正常工作。

2个回答

1
我遇到了同样的问题。
我的崩溃是由于在UISplitViewController的子类中在viewDidLoad中设置leftBarButtonItem引起的。我删除了这两行代码。
let navigationController = self.viewControllers[self.viewControllers.count-1] as! UINavigationController
navigationController.topViewController.navigationItem.leftBarButtonItem = displayModeButtonItem()

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

0

我也意识到这与UISplitViewControllerDelegate方法有关,但我就是无法弄清楚我应该真正做些什么才能使其工作。

你说得对。我也遇到了同样的问题,并通过以下方式解决:

- (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的委托分配为nil。
希望这能像我一样对你有所帮助。

这是因为委托使用assign(或在Swift中使用unowned(unsafe))而不是weak进行存储。这意味着当它被释放时,您需要将其设置为nil - Aaron Brager
我不确定这是否是同一个问题,分割视图没有从屏幕上移除?它只是旋转了吗? - Kevin R
实际上,只是旋转。我从未将uisplitviewcontroller从屏幕中移除。 - Beto
添加了它,但很遗憾没有改变。 - Kevin R
很遗憾听到这个消息。:( - Beto
也许问题不在于UISplitViewController,而是子控制器? - Erakk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接