web-dev-qa-db-ja.com

検出シートがiOS 13で閉じられました

IOS 13より前は、画面全体をカバーするために使用されるビューコントローラーが表示されていました。そして、却下されると、親のビューコントローラーviewDidAppear関数が実行されました。

これで、iOS 13はデフォルトでシートとしてビューコントローラーを表示します。つまり、カードが基になるビューコントローラーを部分的に覆います。つまり、親ビューコントローラーが実際に消えたことはないため、viewDidAppearは呼び出されません。

表示されたビューコントローラシートが閉じられたことを検出する方法はありますか?ある種のデリゲートを使用するのではなく、親ビューコントローラーでオーバーライドできる他の関数 /

73
Marcos Tanaka

閉じられているUIViewControllerのviewWillDisappearをオーバーライドします。 isBeingDismissedブールフラグを介して解任を警告します。

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if isBeingDismissed {
        print("user is dismissing the vc")
    }
}

**ユーザーが下にスワイプの途中でカードを上にスワイプすると、カードが非表示にされていなくても、カードは非表示として登録されます。しかし、それはあなたが気にしないかもしれないEdgeケースです。

0
craft

スウィフト

呼び出す一般的なソリューションviewWillAppear in iOS1

class ViewController: UIViewController {

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            print("viewWillAppear")
        }

        //Show new viewController
        @IBAction func show(_ sender: Any) {
            let newViewController = NewViewController()
            //set delegate of UIAdaptivePresentationControllerDelegate to self
            newViewController.presentationController?.delegate = self
            present(newViewController, animated: true, completion: nil)
        }
    }

    extension UIViewController: UIAdaptivePresentationControllerDelegate {
        public func presentationControllerDidDismiss( _ presentationController: UIPresentationController) {
            if #available(iOS 13, *) {
                //Call viewWillAppear only in iOS 13
                viewWillAppear(true)
            }
        }
    }
0
dimo hamdy