2011-08-15 13 views
0

私は3つのUIViewControllerを私のUINavigationControllerに持っています。 いくつかの点で私はrootViewControllerに行きたいので、そこから新しいUIViewControllerにナビゲートして、動作させることはありません。iOS - 奇妙なナビゲーションの問題?

提案がありますか?

- (IBAction)goToRootAndNavigateToViewController 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 

    //This takes me to the rootViewController but it doesn't navigate to MyViewController 
} 

はperformSelectorを使用しようとすると:WithDelay:

- (void)goToRootAndNavigateToViewController 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

    [self performSelector:@selector(doSomething) withObject:nil afterDelay:10]; 
} 

- (void)doSomething 
{ 
    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 
} 

答えて

0

私はpopToRootViewControllerがフルNSRunLoopを占めると考えています。

performSelector:withObject:afterDelayなどを使用して、別の関数で次のビューコントローラをプッシュする必要があります。

は、またはあなたが常にちょうどあなたがアニメーションが完了したときに、あなたのmvcコントローラをプッシュする必要があり

+0

遅延を追加するとハッキーですが、ViewControllerを設定すると、私のルートviewcontrollerを維持するために – aryaxt

+0

は、ハッピーではない遅延を設定します。これらのメソッドは、NSRunLoop内部でこれを行うために、理由のためにsdkに入れられます。必要に応じて遅延間隔を0.0に設定します。ルート・ビュー・コントローラーを維持しながらビュー・コントローラーを設定することも問題ではありません。あなたのルートビューコントローラへの参照を保存し、それを 'setViewControllers:animated'に渡すNSArrayの最初の要素として持っていれば、それはまだルートとして持っています – cpjolicoeur

+0

私は動作しなかった遅延を試みました。遅延15秒とそれはまだ動作しません – aryaxt

0

それらを手動で設定する[self.navigationController setViewControllers:]呼び出しを行うことができます。最初のアニメーションが完了したら呼び出すようにしてください(- (void)viewDidAppear:(BOOL)animatedなど)

0

私はこの問題に直面しているのか分かりませんが、新しいビューコントローラをルートビューコントローラの-viewDidAppear:メソッド。

0

- (IBAction)goToRootAndNavigateToViewControllerを使用している現在のビューコントローラと関係がありますが、一度ポップされるとコントロールが失われてしまいます。したがって、連続したステートメントを動作させないようにする。

私があなただったら、私はプッシュMyViewControllerインスタンスがないUINavigationControllerからポップされるように、おそらくリリースとを割り当て解除しようとしている現在のViewControllerから、お好みのrootViewControllerで常に行われていることを確認します。

おそらく、あなたはMyViewControllerインスタンスをプッシュすることがあり、この実装では、あなたのrootViewController

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    // Check the right condition for pushing MyViewController... 
    // if it's YES... 
    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 
} 

に、このような- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animatedとしてのデリゲートメソッドの実装を追加することもできます。あなたが事前にしなければならないことは、何らかの種類の条件付きフラグを使用していることです。状況が正しいことを確認します。を押してください。MyViewController