1

私はアプリを構築していますが、最近、従来のセグエが原因で巨大なメモリ リークが発生していることを発見しました。そこでアンワインドセグエを学びました。単純に使用すると、すべてが正常に機能します。

    @IBAction func prepareForUnwindToMainFromFriends(segue: UIStoryboardSegue) {
    }

メモリ リークが解決され、「すべてがすばらしい」。しかし、このソリューションは、UI の観点から見ると見苦しく見えます。だから私はこのウェブサイトからこの機能を実装しました。そして少し変えました。

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 に戻ることはできません。このセグエは一度しか使えないようです。

誰でも何が起こっているのか知っていますか?

4

1 に答える 1

1

上記のトランジション アニメーション コードを使用して、セグエの巻き戻しのサンプル コードを作成しました。セグエのアンワインドを理解するのに役立つSampleUnwindプロジェクトをチェックしてください(そしてそれがどれほど簡単か)。

プロジェクトには 1 つのナビゲーション コントローラーがあり、その中には 3 つのビュー コントローラーがあります (Home->First->second)。

ホーム コントローラーでは、次の巻き戻しアクションが作成されます。これは、2 番目のコントローラーの「ホーム」ボタンがタップされたときに呼び出されます (単純な巻き戻しのもの)。

@IBAction func unwindToHomeViewController(segue:UIStoryboardSegue) {
}

TempNavigationControllerサブクラスを作成し、それをストーリーボードのナビゲーション コントローラーにUINavigationController設定しました。TempNavigationController上記のメソッドは、次の参照に従って fromViewController のコンテナーになるため、その中に pesent されています。

参照: 2 つの子ビュー コントローラー間の移行に関するAppleのドキュメント。

これをプロジェクトと比較すると、プロジェクトで重複した (または複数の/間違った) セグエを見つけることができるかもしれません。

于 2015-05-22T11:52:38.527 に答える