モーダルを提示するビューコントローラのモーダル解雇を検出したいのですが。
このメソッドは、新しいCard Modalsで新しいiOS 13スワイプ解除を検出するのに驚くべきことです。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MyIdentifier" {
segue.destination.presentationController?.delegate = self
}
}
extension MyController: UIAdaptivePresentationControllerDelegate {
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
//clean up UI (de-selecting stuff) once modal has been dismissed
}
}
_
ただし、Modalがプログラムでアクションを閉じると、PresentationControllerDidismissは呼び出されません。
@IBAction func btnDismissTap(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
_
これは、「スワイプ」の却下が何であれ、すべての解雇を同じように検出できるように、プログラムで電話をかけることができる方法がありますか。現在、私のモジュールに余分な「却下」の委任状を書いていて、不要になるようです。
Mojtaba Hosseini、答えは私が探していたものです。
現在、ユーザーがモーダルプラスを却下したことをプレゼンテーションビューに知らせるための代理機能を書く必要があります。スワイプ解除のPresentationControllerDidismissハンドラ
@IBAction func btnDismissTap(_ sender: Any) {
self.dismiss(animated: true, completion: {
self.delegate?.myModalViewDidDismiss()
})
}
_
私はこれらの両方を同じ方法で扱いたいと思いました、そしてMojtabaの答えは私にとって働きます。ただし、PresentationControllerDidSismissは、Self.Dismiss Completionブロック内でそれを呼び出すと、以前に呼び出す必要があります。
私は自分のコードを「PresentationControllerWilldismiss」(明確にするために)を使って、私がプログラムでプログラムで却下する前にデリゲートと呼ばれ、それは素晴らしい動作をしました。
@IBAction func btnDismissTap(_ sender: Any) {
if let pvc = self.presentationController {
pvc.delegate?.presentationControllerWillDismiss?(pvc)
}
self.dismiss(animated: true, completion: nil)
}
_
今、私はコードでモーダル解除を処理するために代理機能を作成する必要がなくなり、私のスワイプハンドラはすべてのシナリオの世話をします。
FYI、モーダルが解除されたら、提示されたUI上のいくつかのUIクリーンアップ(DE-Selectionなど)を実行しています。
@マットが言及されているように、代理人によってビューを却下した人に知らせる必要はありません。それはすでに知られているからです。 [〜#〜]呼び出されるデリゲートメソッドが必要な場合は、ビューを閉じた後、手動で自分自身を呼び出す必要があります。
@IBAction func btnDismissTap(_ sender: Any) {
self.dismiss(animated: true) {
presentationController?.delegate?.presentationControllerDidDismiss?(presentationController!)
}
}
_