次のコードにより、ユーザーはビュー階層をドリルダウンし、ボタンを押すだけでルート ビュー コントローラーに戻り、新しいビューをプッシュできます。
DetailViewController.m ~ ナビゲーション スタックをクリアするビュー コントローラー:
- (IBAction)buttonPressed:(id)sender {
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"popBack" object:nil]];
}
上記のコードは を呼び出しNSNotificationCenter
、RootViewController が受信したときに反応できるという通知をポストします。ただし、最初に、通知を受け取るために RootViewController を登録する必要があります。
RootViewController.m
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushViews) name:@"popBack" object:nil];
[super viewDidLoad];
}
次に、RootViewController は、参照されるセレクターを設定する必要があります-pushViews
。
- (void)pushViews {
//Pop back to the root view controller
[self.navigationController popToRootViewControllerAnimated:NO];
//Allocate and init the new view controller to push to
NewViewController *newVC = [[NewViewController alloc] init];
//Push the new view controller
[self.navigationController pushViewController:newVC animated:YES];
}
を呼び出すときは、必ずアニメーション-popToRootViewControllerAnimated:
を指定してください。NO
アニメーションを有効にすると、ナビゲーション バーのアニメーションに問題が発生し、システムが混乱します。上記のコードが呼び出されると、ナビゲーション スタックがクリアされ、RootViewController だけが残され、NewViewController が追加されます。
最初のコードが完全に実行されなかった理由は、DetailViewController から呼び出した後-popToRootViewController:
、RootViewController のメソッドがメイン スレッドを占有し、DetailViewController が解放されたためです。したがって、その View Controller からそれ以上のコードは実行されませんでした。上記のコードを使用すると、ナビゲーション スタックは、読み込まれている同じビュー コントローラーに戻ります。