私はこれについて自分で解決策を考えてきました。たとえば、ネイティブ メール アプリの実装の動作を見ると、[戻る] ボタンをクリックすると、 の前に選択解除アニメーションが開始されますviewDidAppearが、どちらにもありませviewWillAppearん。インタラクティブに閉じない場合、アニメーションは非常に高速で突然になるためです。ただし、 で対話的に非表示にして選択をviewWillAppear解除すると、ネイティブのメール アプリケーションのように、指のジェスチャと共にセルが徐々に選択解除されます。viewWillAppearアニメーションブロック内で内部的に呼び出されているようです。実験から、アニメーションをクリックして戻ると、目的のアニメーションが得られますperformSelector:@selector(deselect) afterDelay:0。viewWillAppear
要約すると、ユーザーが戻るボタンをタップしたperformSelector:@selector(deselect) afterDelay:0ときviewWillAppear: で、ユーザーがインタラクティブにスワイプして閉じるdeselectときviewWillAppear。
では、この 2 つのケースをどのように区別すればよいでしょうか。確かに十分な情報がありませんviewWillAppear。ここで、ナビゲーション コントローラーのデリゲート メソッドを実装し、インタラクティブ ポップが開始されようとしていることをテーブル ビュー コントローラーに通知し (前にviewWillAppear)、それを Apple の通常のインタラクティブ ポップ インタラクション コントローラーに渡すことができます。キャッチ?_interactionControllerプライベート API です。ばかばかアップル。
その後、 を にフィードできることを発見しUINavigationControllerましたinteractivePopGestureRecognizer。そのため、真ん中に座って、デリゲート メソッドをリッスンし、テーブル ビュー コントローラーにシグナルを送り、Apple のジェスチャ レコグナイザーのデリゲートの実装を呼び出すことができます。
これで十分です。おそらく、上記のオプションのプロトコルとカテゴリを使用しUITableViewControllerて、ポップされたテーブル ビュー コントローラー インスタンスがシグナル メソッドに応答するかどうかをテストします。もちろん、またはサブクラス。