[解決済み] 提示されたビューコントローラが破棄されたことを検出する
質問
例えば、VC2というビューコントローラクラスのインスタンスがあるとします。 VC2には、それ自体を破棄する"cancel"ボタンがあります。 しかし、このボタンがトリガーされたときに、コールバックを受け取ることができません。 VC2はブラックボックスです。
ビューコントローラ(VC1と呼ばれる)は
presentViewController:animated:completion:
メソッドを用いてVC2を表示します。
VC1 は、VC2 が解散したことを検出するために、どのようなオプションを持っていますか?
編集:@rory mckinnelのコメントと@NicolasMiariの回答から、私は以下を試しました。
VC2にて。
-(void)cancelButton:(id)sender
{
[self dismissViewControllerAnimated:YES completion:^{
}];
// [super dismissViewControllerAnimated:YES completion:^{
//
// }];
}
VC1では
//-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
- (void)dismissViewControllerAnimated:(BOOL)flag
completion:(void (^ _Nullable)(void))completion
{
NSLog(@"%s ", __PRETTY_FUNCTION__);
[super dismissViewControllerAnimated:flag completion:completion];
// [self dismissViewControllerAnimated:YES completion:^{
//
// }];
}
しかし
dismissViewControllerAnimated
は呼び出されませんでした。
どのように解決するのですか?
docsによると、実際のdissueはpresenting controllerが担当します。提示されたコントローラが自分自身をdisuseする場合、提示者にそれを行うように依頼します。そのため、VC1コントローラでdissueViewControllerAnimatedをオーバーライドすると、VC2でcancelを押したときに呼び出されることになると思います。dismissを検出し、実際のdissueを行うスーパークラスのバージョンを呼び出します。
議論からわかったように、これはうまくいかないようです。基本的なメカニズムに依存するのではなく、代わりに
dismissViewControllerAnimated:completion
を VC2 自身で呼び出す代わりに
dismissViewControllerAnimated:completion
で
self.presentingViewController
をVC2で実行します。これは、その後、あなたのオーバーライドを直接呼び出します。
より良い方法は、モーダルコントローラが完了したときに呼び出されるブロックを VC2 に提供させることです。
つまり、VC2 で、例えば
onDoneBlock
.
VC1では以下のように表示されます。
-
VC1において、VC2を作成します。
-
VC2のdone handlerを設定します。
VC2.onDoneBlock={[VC2 dismissViewControllerAnimated:YES completion:nil]};
-
self presentViewController:VC2 animated:YES completion:nil]でVC2コントローラーを通常通り提示する。
-
VC2において、ターゲットアクションのキャンセル呼び出しで
self.onDoneBlock();
結果、VC2は上げた人に「終わったよ」と伝える。を拡張することができます。
onDoneBlock
を拡張して、モーダルが完了したかどうか、キャンセルされたかどうか、成功したかどうかなどを示す引数を持たせることができます。
関連
-
libc++abi.dylib が NSException 型の捕捉できない例外で終了する理由 エラー
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] 文字列の長さを取得する
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UIViewに角丸をつける
-
[解決済み] コードサインエラーです。期限切れのプロファイルを削除した後、プロビジョニングプロファイルが見つからない
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] SwiftでiOSキーボードを任意の場所でタッチして閉じる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] UITextViewのプレースホルダー
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Unwind segueは何に使うのか、どう使うのか?
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] UINavigationBarの1px下の行を非表示にする方法
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
-
[解決済み] swiftで電子メールアドレスを検証する方法は?