web-dev-qa-db-ja.com

新しいView Controllerを表示した後、現在のView Controllerを終了します-swift

VCを閉じて、新しいVCを提示しようとしています。しかし、私は古いVCがもう存在することを望まない。以下のコードを使用して、現在のVCを削除し、新しいコードを提示します。しかし、この方法では、解雇と現在の間に時間間隔があります。ユーザーにこれに気づいて欲しくありません。そのため、最初に新しいVCを提示してから、前のものを削除します。これを行う方法はありますか?

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationController = self.storyboard?.instantiateViewController(withIdentifier: "login") as! Login
let presentingVC = self.presentingViewController
self.dismiss(animated: false, completion: { () -> Void   in
    presentingVC!.present(destinationController, animated: true, completion: nil)
})
11
Hos Ap

最善の方法は、実際に戻ったときに現在のVCを閉じることだと思います。つまり、現在のVCを使用してdestinationControllerを提示し、戻ったときに両方のVCを閉じます

5
JohnnyAW

免責事項

したがって、新しいVCをモーダルで提示する必要がある場合を除き、2つのVC間でセグエを実行することをお勧めします。後で元のVCから手動で削除したいので、モーダルでのみ表示しているようです。私の意見ではセグエを使用する方が簡単であるだけでなく、以下で概説する方法を使用することもできます。

ソリューション

これはおそらく最もエレガントな方法ではありませんが、古いVCを介してprepareForSegueを介して次のVCに渡し、それを新しいVCで破棄することができますviewDidLoad

たとえば、新しいVCには次のようなものがあります。

class NewVC: UIViewController {

    ...
    var prevVC: PrevVC!

    override func viewDidLoad() {
        super.viewDidLoad()

        prevVC.dismiss(animated: false, completion: nil)
    }

}

そのため、newVCが読み込まれると、以前のVCは破棄されます。 prevVCクラスで必要なことは、prepareForSegueのインスタンスを渡すことだけです。

class PrevVC: UIViewController {
    ...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationVC = segue.destination as? NewVC {

            destinationVC.prevVC = self

        }
    }

}

もちろん、必要なときにnewVCを提示するだけで、他のすべての面倒を見ることができます。

10
Benjamin Lowry