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

Posted

技术标签:

【中文标题】UISplitViewController 中对开始/结束外观转换的不平衡调用【英文标题】:Unbalanced calls to begin/end appearance transitions in UISplitViewController 【发布时间】:2015-12-27 18:42:15 【问题描述】:

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

Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0x160015600>.

主视图控制器和详细视图控制器都嵌入在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
    

如果有人能提供此问题的解决方案,那就太好了,在此先感谢。

顺便说一句:拆分视图控制器是在情节提要中设置的

显示细节视图控制器是在tableView:didSelectRowAtIndexPath: 方法中完成的,如下所示:

if let detailViewController = delegate as? DetailViewController 
    detailViewController.navigationItem.leftItemsSupplementBackButton = true
    detailViewController.navigationItem.leftBarButtonItem = splitViewController!.displayModeButtonItem()
    splitViewController!.showDetailViewController(detailViewController.navigationController!, sender: self)

【问题讨论】:

在以编程方式构建所有内容时也面临同样的问题。所以我想无论是在情节提要上还是以编程方式完成,都会出现这个问题。 参考 - cdn3.raywenderlich.com/wp-content/uploads/2015/05/… 然后添加 func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -&gt; Bool return true 在 iPhone 上试用 【参考方案1】:

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

一个可能的原因是您可能试图在您掌握UIViewControllerviewDidLoad() 方法中呈现详细视图的第一个“实例”?在这种情况下,您的应用可能会尝试在主视图出现之前显示详细视图。请注意 view did load view 和 view did appear 之间的区别:

覆盖 func viewDidLoad()

说明:

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

在视图控制器加载了它的视图之后调用这个方法 层次结构到内存中


覆盖 func viewDidAppear(animated: Bool)

说明:

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

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

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

    // present/load detail view here instead

【讨论】:

抱歉,当我展示详细视图控制器时没有澄清,请查看已编辑的问题。不过,感谢您的努力,这也是我在问这个问题之前读过的内容,但是我想不出我的应用程序这样做的方式。 @OliverBorchert 嗯,如果没有更详细的代码视图,我真的不知道。您是否可以在第一个状态更改为细节的某个时刻为某些过渡设置动画? (animation: ...)。如果是这样,可能将此类动画设置为 false 以测试它们是否是您的错误的原因(即,导致重叠过渡) 我的应用程序中真的只有拆分视图控制器:/ 我怀疑self.delegate = self 是错误的来源。通常你将一些类型实例设置为你的类作为委托(即var textField = UITextField有一个定义为textField.delegate = self的委托)。使用 self.delegate = self 可能会为回调创建循环行为,例如瞬间覆盖两个视图(同时为两个过渡设置动画)。【参考方案2】:

这可能为时已晚,但无论如何,我使用 perform segue 而不是 showDetailViewController 解决了这个问题

【讨论】:

showDetailViewControllerUISplitViewController 中有一些特殊用途,它会根据尺寸等级(自适应)推送/呈现。所以还是用showDetailViewController比较好,不过这好像是个问题

以上是关于UISplitViewController 中对开始/结束外观转换的不平衡调用的主要内容,如果未能解决你的问题,请参考以下文章

在 UISplitViewController 中覆盖 RootViewController.xib

在 UISplitViewController 中编辑事件

UISplitViewController - 双列样式不起作用

UISplitViewController:在 detailView 中导航

UISplitviewcontroller - 主视图和详细视图中的大小类问题

在 UISplitViewController 中使用 SwiftUI 列表侧边栏