3

ナビゲーションコントローラーを使用するiPhoneアプリケーションがあります。そのコントローラーで、いくつかのビューをプッシュします。場合によっては、ビュースタックを「クリア」し、ナビゲーションコントローラーのrootViewControllerのみをスタックに残して、別のviewControllerをプッシュしたいことがあります。

誰かがこれを行う方法の例を教えてもらえますか?スタックをクリアするメソッドが表示されません。


回答1:ボタンアクションに次のコードを入れようとしました:

[self.navigationController popToRootViewControllerAnimated:NO]; 

 do some stuff here to prepare for the push.

[self.navigationController pushViewController:self.myOtherController animated:YES];

ただし、roorControllerにのみポップします。それは私が望む他のviewControllerをプッシュしません。

4

4 に答える 4

4

次のコードにより、ユーザーはビュー階層をドリルダウンし、ボタンを押すだけでルート ビュー コントローラーに戻り、新しいビューをプッシュできます。

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 からそれ以上のコードは実行されませんでした。上記のコードを使用すると、ナビゲーション スタックは、読み込まれている同じビュー コントローラーに戻ります。

于 2012-06-06T23:35:51.530 に答える
1

探していると思います-popToRootViewControllerAnimated:

于 2012-06-06T23:31:05.670 に答える
0
UIViewController* root = [self.navigationController.viewControllers objectAtIndex:0];

self.navigationController.viewControllers = [NSArray arrayWithObjects:root, cal, nil];

'cal'ビューコントローラの移動先。しかし、アニメーションはありません。

于 2012-08-31T09:02:14.617 に答える
0

クラーケンの答えに加えて、

ポップする UIViewController に以下の関数を追加します。

(void)viewDidDisappear:(BOOL)animated {

    [super viewDidDisappear:YES];

    for(UIView *view in self.view.subviews)
    {
       [view removeFromSuperview];
    }
}
于 2014-03-10T06:58:26.753 に答える