IOS 13より前は、画面全体をカバーするために使用されるビューコントローラーが表示されていました。そして、却下されると、親のビューコントローラーviewDidAppear
関数が実行されました。
これで、iOS 13はデフォルトでシートとしてビューコントローラーを表示します。つまり、カードが基になるビューコントローラーを部分的に覆います。つまり、親ビューコントローラーが実際に消えたことはないため、viewDidAppear
は呼び出されません。
表示されたビューコントローラシートが閉じられたことを検出する方法はありますか?ある種のデリゲートを使用するのではなく、親ビューコントローラーでオーバーライドできる他の関数 /?
閉じられているUIViewControllerのviewWillDisappearをオーバーライドします。 isBeingDismissed
ブールフラグを介して解任を警告します。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if isBeingDismissed {
print("user is dismissing the vc")
}
}
**ユーザーが下にスワイプの途中でカードを上にスワイプすると、カードが非表示にされていなくても、カードは非表示として登録されます。しかし、それはあなたが気にしないかもしれないEdgeケースです。
スウィフト
呼び出す一般的なソリューション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)
}
}
}