容器视图控制器 - 开始/结束外观转换的不平衡调用

时间:2016-09-15 11:49:42

标签: ios swift uiviewcontroller uicontainerview

我正在尝试开发Apple View文档中显示的Container View Controller。

现在我在viewDidAppear中有简单的初始化代码:

presentedVC = self.storyboard!.instantiateViewControllerWithIdentifier(Storyboard.yesNoControllerID)
self.addChildViewController(presentedVC)
presentedID = Storyboard.yesNoControllerID
presentedVC.view.frame = containerView.bounds
self.containerView.addSubview(presentedVC.view)
presentedVC.didMoveToParentViewController(self)

我已经实现了交换方法,就像在Apple doc中一样:

private func exchangeVC(withVC viewController: UIViewController){
    presentedVC.willMoveToParentViewController(nil)
    self.addChildViewController(viewController)

    viewController.view.frame = newViewStartFrame
    let endFrame = oldViewEndFrame
    self.containerView.addSubview(viewController.view)

    self.transitionFromViewController(presentedVC, toViewController: viewController, duration: 0.25, options: UIViewAnimationOptions.CurveLinear, animations: {
        viewController.view.frame = self.presentedVC.view.frame
        self.presentedVC.view.frame = endFrame
        }) { (finished) in
            self.presentedVC.view.removeFromSuperview()
            self.presentedVC.removeFromParentViewController()
            viewController.didMoveToParentViewController(self)
            self.presentedVC = viewController
    }

}

然后,我有一个简单的按钮:

let controller = self.storyboard!.instantiateViewControllerWithIdentifier(presentedID)
exchangeVC(withVC: controller)

使用此代码,我的控制器在按下按钮时在屏幕上显示动画。但是在动画结束时我得到了:

  

对开始/结束外观转换的不平衡调用   UIViewController:0x7aecf730。

你能告诉我我做错了什么吗?如何摆脱这个错误/警告?

3 个答案:

答案 0 :(得分:2)

这是一个容易犯的错误,但Apple的transition(from:to:duration:options:animations:completion:)文档指出:

  

此方法将第二个视图控制器的视图添加到视图中   层次结构,然后执行动画中定义的动画   块。动画完成后,它会删除第一个视图   视图层次结构中的控制器视图。

您收到了Unbalanced calls to begin/end appearance transitions警告,因为您使用以下内容添加了子视图:

self.containerView.addSubview(viewController.view)

...然后在调用transition(from:to:duration:options:animations:completion:)

时再次添加它

删除对addSubview的调用可以解决问题。

答案 1 :(得分:1)

我有类似的问题。通常,当您尝试呈现相同的视图控制器而不首先解除它时会出现该警告,但转换方法应该为您处理所有这些。我最后使用

来修复它
UIView.animate(withDuration:animations:completion:)

而不是

UIViewController.transition(from:to:duration:options:animations:completion:)

如上所述。当然,我也必须手动添加和删除子视图。我不确定为什么这个改变有效,但我最好的猜测是发出警告的UIViewController转换方法有问题。幸运的是,修复非常简单。

答案 2 :(得分:0)

在按钮点击处理程序中,我在iPhone上看到此不平衡通话错误。追溯到解雇(动画:否),然后是礼物(..动画:否)

解决方案是在完成处理程序中处理此dismiss调用。