segueForUnwindingToViewController导致“警告:尝试在< ...>上呈现< ...>已经呈现< ...>”

时间:2015-05-12 16:10:42

标签: ios swift segue uistoryboardsegue unwind-segue

我正在构建一个应用程序,并且最近发现传统segue引起的巨大内存泄漏。 因此我学会了放松segue。如果我只是使用:

,一切正常
    @IBAction func prepareForUnwindToMainFromFriends(segue: UIStoryboardSegue) {
    }

内存泄漏已经解决,“一切都很棒”。但是从UI的角度来看,这个解决方案看起来很难看。所以我从this website实现了这个功能。并改变了一点。

override func segueForUnwindingToViewController(toViewController: UIViewController, fromViewController: UIViewController, identifier: String?) -> UIStoryboardSegue {
    return UIStoryboardSegue(identifier: identifier, source: fromViewController, destination: toViewController) {
        let fromView = fromViewController.view
        let toView = toViewController.view
        if let containerView = fromView.superview {
            let initialFrame = fromView.frame
            var offscreenRect = initialFrame
            var offscreenRectFinal = initialFrame
            offscreenRect.origin.x += CGRectGetWidth(initialFrame)
            offscreenRectFinal.origin.x -= CGRectGetWidth(initialFrame)
            toView.frame = offscreenRect
            containerView.addSubview(toView)
            let duration: NSTimeInterval = 1.0
            let delay: NSTimeInterval = 0.0
            let options = UIViewAnimationOptions.CurveEaseInOut
            let damping: CGFloat = 0.9
            let velocity: CGFloat = 4.0
            UIView.animateWithDuration(duration, delay: delay, usingSpringWithDamping: damping,
                initialSpringVelocity: velocity, options: options, animations: {
                    toView.frame = initialFrame
                    fromView.frame = offscreenRectFinal

                }, completion: { finished in
                    fromView.removeFromSuperview()
                    if let navController = toViewController.navigationController {
                        navController.popToViewController(toViewController, animated: false)
                    }
            })
        }
    }
}

但现在我收到一条错误消息:

2015-05-12 08:47:31.841 PING0.4[4343:1308313] Warning: Attempt to present <NotificationViewController: 0x177030b0>  on <PING0_4.ViewController: 0x16271000> which is already presenting <NotificationViewController: 0x1a488170>

我的应用程序中被阻止了。我可以从VC1转到VC2,然后回到VC2但是我再也无法回到VC1。看起来我只能使用这个segue一次。

任何人都知道发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

使用上面的过渡动画代码创建了展开segue的示例代码。 Checkout SampleUnwind项目将帮助您了解unwind segue(以及它有多简单)。

在项目中有一个导航控制器,里面有三个视图控制器(Home-&gt; First-&gt; second)。

在Home控制器中创建了以下展开操作,当主页&#39; Home&#39;点击第二个控制器的按钮(简单放松的东西)。

@IBAction func unwindToHomeViewController(segue:UIStoryboardSegue) {
}

我创建了TempNavigationController子类UINavigationController并将TempNavigationController设置为storyboard中的导航控制器。 你给出的上面的方法是在它内部,因为这将是fromViewController的容器,如下面的referance。

参考:Apple有关两个子视图控制器之间转换的文档。

您可以将其与项目进行比较,也许您可​​以在项目中找到任何重复(或多个/错误)的segue。