UISplitViewController中开始/结束外观转换的不平衡调用

bor*_*ero 8 uinavigationcontroller uisplitviewcontroller ios9 swift2

我的UISplitViewController基本上就像一个魅力,除了在第一次(仅第一次!)从主表视图转换到详细视图时显示一个恼人的错误消息.

Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0x160015600>.
Run Code Online (Sandbox Code Playgroud)

主视图和详细视图控制器都嵌入在一个UINavigationController.但是,只有在设置以下内容时才会出现错误(这是iPhone上逻辑行为所必需的):

class MySplitViewController: UISplitViewController, UISplitViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool {
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人能提供这个问题的解决方案,那将是非常好的,在此先感谢.

BTW:拆分视图控制器已在故事板中设置

呈现详细视图控制器的tableView:didSelectRowAtIndexPath:方法如下:

if let detailViewController = delegate as? DetailViewController {
    detailViewController.navigationItem.leftItemsSupplementBackButton = true
    detailViewController.navigationItem.leftBarButtonItem = splitViewController!.displayModeButtonItem()
    splitViewController!.showDetailViewController(detailViewController.navigationController!, sender: self)
}
Run Code Online (Sandbox Code Playgroud)

dfr*_*fri 2

UITableView最有可能的是,您的第一次从主视图(在UIViewController?)到详细UIViewController视图()的转换是UISplitViewController在活动/当前视图完成显示之前开始的。

可能的原因是您可能试图以viewDidLoad()您掌握的方法呈现详细视图的第一个“实例” UIViewController在这种情况下,您的应用程序可能会尝试在主视图完成显示之前呈现详细视图。请注意视图确实加载视图和视图确实出现之间的区别:

覆盖函数 viewDidLoad()

描述:

在控制器的视图加载到内存后调用。

该方法在视图控制器将其视图层次结构加载到内存后被调用。


覆盖 func viewDidAppear(动画:Bool)

描述:

通知视图控制器其视图已添加到视图层次结构中。您可以重写此方法来执行与呈现视图相关的其他任务。

现在,由于您的问题没有显示如何加载初始详细视图,因此您自己可能已经注意到以下建议,但无论如何:如果您的详细视图是从 中呈现的viewDidLoad(),请尝试将其移至该viewDidAppear()方法:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)

    // present/load detail view here instead
}
Run Code Online (Sandbox Code Playgroud)