iPhoneのスタックからView Controllerをポップした後、自動的にメソッドを呼び出す方法
質問
ナビゲーションスタックから子ビューをポップした後、iPhoneの親ビューを更新する必要があります。子がスタックからポップされ、親が再び表示されたときに通知されるように親ビューを設定したり、自動メソッド呼び出しを受信するにはどうすればよいですか?
ユーザーは、ユーザーが完了してビューをポップした後、親ページに表示したい子ページにデータを入力します。
ご協力ありがとうございます!
解決
この同じ問題を解決しました。上記の回答はほぼ正しいので、デリゲートの設定を忘れていました。
リストのサイズを表示し、リストのサイズを変更する可能性のある子View Controllerを呼び出し、戻り時にサイズを更新する必要があるルートView Controllerがあります。
親ビュー(下のSettingsView)を作成し、UINavigationControllerのルートビューとして追加するとき、ビューを表示する前にUINavigationControllerのデリゲートを設定することを確認します-これが重要な部分です:
SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv];
[nc setDelegate:sv];
親ビューで、UINavigationControllerDelegateプロトコルを実装します。
@interface SettingsView : UIViewController <UINavigationControllerDelegate>
そしてwillShowViewControllerメソッドを提供します:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// Your code to update the parent view
}
これは、子ビューが閉じられた後、親ビューが再表示される前に呼び出されます。
他のヒント
私もこのようなことをする必要がありました。 UINavigationController を所有していた ViewController では、次のように willShowViewController を実装する必要がありました。
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}
このメソッドは、UINavigationControllerがビューを変更するたびに呼び出されます。私があなたの質問を正しく理解しているなら、私はこれがあなたが望むことをするべきだと思います。
ここには混乱があると思います。 UIView
は、 UINavigationController
のスタックにプッシュおよびポップされません。プッシュおよびポップされているのは UIViewControllers
で、それぞれが1つまたは(多くの場合)複数のビューを処理します。
幸いなことに、 UIViewController
には次のメソッドがあります:
-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;
これらは、ビューが表示されようとしている(表示されていない)か、表示されたばかりの(表示されている)ときに呼び出されます。タブバー、モーダルビュー、Navigation Controllerを使用しています。 (そして、カスタムコントローラーを実装するときにこれらを使用することをお勧めします。)
したがって、あなたの場合、私が正しく理解していれば、単に「親ページ」と呼ぶもので viewWillAppear
:または viewDidAppear
:メソッドをオーバーライドする必要があります。 (おそらく UIViewController
によって処理されます)、入力したデータを反映するようにページの外観を更新するコードを挿入します。
(記憶が正しければ、 UINavigationController
が最初に表示されたときに viewWill / DidAppear:
メッセージを取得することを確認する必要があります。子コントローラーに送信されます。これをテンプレートまたはIBでセットアップする場合、おそらく心配する必要はありません。)
Felixyzの答えが私にとってのトリックでした。ビューが表示されるメソッドを呼び出すと、ビューが表示されるたびにメソッドが実行されます。ロードされたビューとは異なり、ビューが最初にロードされたときにのみコードを実行します。そのため、子ビューが親に表示される情報を変更し、サックからポップされた場合、親ビューはそれ自体を更新しません。しかし、親がビューを呼び出した場合、ビューが表示されるたびにコードが実行されます。
同時にスーパーメソッドを呼び出すようにしてください。適切な実装は次のようになります。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"View Appearing");
}
あるコントローラーから別のコントローラーに通知する必要がある場合は、こちら(2番目の回答を参照)。
残念ながら、説明したとおりの正確なタスクについては自動通知(AFAIK)はありません。 ニーズを満たすために、子コントローラーの viewWillDisappear 関数で委任する(つまり、親コントローラーに)メッセージを送信できます。