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 示例中的做法 ;-)
我在 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 示例中的做法 ;-)