2009-10-23 19 views
6

私はUINavigationControllerに関する問題があります。UINavigationControllerをリセットするにはどうすればよいですか?

私は、ナビゲーションコントローラのプッシュ機能とポップ機能を切り替える3つのビューコントローラを持つアプリケーションを持っています。私は第三のビューコントローラに立っ と
を呼び出す:

問題は、これは[self.navigationController popToRootViewControllerAnimated:YES]。
これは最初のビューコントローラ(私が欲しいものです)に私をもたらしますが、次に2番目のビューコントローラに移動しようとすると、何らかの理由で3番目のビューコントローラになります。

ナビゲーションコントローラをリセットする方法はありますか、それとも間違った方法ですか?

をユーザーがカメラを起動することを決定したときに、次のコードは、ルートビューコントローラに呼び出されます。ここでは

は、私はナビゲーションコントローラをプッシュしてポップするために使用しているコードです。

if(self.cameraViewController == nil) 
{ 
     CollageCameraViewController *camView = [[CollageCameraViewController alloc] init];//WithNibName:nil bundle:[NSBundle mainBundle]]; 
     self.cameraViewController = camView; 
     [camView release]; 

} 
[self.navigationController pushViewController:self.cameraViewController animated:NO]; 

ユーザが写真集を撮影した後に、次のコードは、CollageCameraViewController(秒)から呼び出されます。ユーザーが戻ることを決定したときに、次のコードは、CollageRenderViewControllerから呼び出され

if(self.renderView == nil) { CollageRenderViewController *renderViewController = [[CollageRenderViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]]; self.renderView = renderViewController; [renderViewController release]; } [self.navigationController pushViewController:self.renderView animated:YES]; 

メイン(ルート)ビューへ:

[self.navigationController popToRootViewControllerAnimated:YES]; 

今、CollageCameraViewControllerを再度プッシュしようとすると、代わりにCollageRenderViewControllerで終わるのですが、それはなぜですか?

乾杯、 アンドレアス

+0

あなたのコードの一部を投稿して、どのようにあなたのView Controllerをプッシュ/ポップしているのか、正確に何を押してポップしているのか見ることができます。 – Jasarien

答えて

2

ルートビューコントローラにポップしたら、それは「リセット」されます。 navigationControllerの次のアクションは、適切なView Controllerをプッシュ(または再押し)することです。スタックを「ナビゲート」しようとしてはいけません。

更新日:

を私はあなたのコードをテストするためのナビゲーションベースのiPhoneのプロジェクトを作成し、それが動作します。私の3つのビューには、タップされたときにコントローラーにIBActionメッセージを送信する単一のボタンがあります。

RootViewController.h:

@class SecondViewController; 

@interface RootViewController : UIViewController { 
    SecondViewController *secondViewController; 
} 

@property (nonatomic, retain) SecondViewController *secondViewController; 

- (IBAction)pushSecondVC; 

@end 

RootViewController.m:

#import "RootViewController.h" 
#import "SecondViewController.h" 

@implementation RootViewController 

@synthesize secondViewController; 

- (IBAction)pushSecondVC { 
    if(self.secondViewController == nil) 
    { 
     SecondViewController *secondVC = [[SecondViewController alloc] init]; 
     self.secondViewController = secondVC; 
     [secondVC release]; 
    } 
    [self.navigationController pushViewController:self.secondViewController animated:NO]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.title = @"Root View"; 
} 

SecondViewController

は、ここに私のコードです。H:

#import <UIKit/UIKit.h> 

@class ThirdViewController; 

@interface SecondViewController : UIViewController { 
    ThirdViewController *thirdViewController; 
} 

@property (nonatomic, retain) ThirdViewController *thirdViewController; 

- (IBAction)pushThirdVC; 

@end 

SecondViewController.m:

#import "SecondViewController.h" 
#import "ThirdViewController.h" 

@implementation SecondViewController 

@synthesize thirdViewController; 

- (IBAction)pushThirdVC { 
    if(self.thirdViewController == nil) 
    { 
     ThirdViewController *thirdVC = [[ThirdViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]]; 
     self.thirdViewController = thirdVC; 
     [thirdVC release]; 
    } 
    [self.navigationController pushViewController:self.thirdViewController animated:YES]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.title = @"2nd View"; 
} 

ThirdViewController.h:

#import <UIKit/UIKit.h> 

@interface ThirdViewController : UIViewController { 
} 

- (IBAction)popToRoot; 

@end 

ThirdViewController.m:

#import "ThirdViewController.h" 

@implementation ThirdViewController 

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

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.title = @"3rd View"; 
} 
+0

View Controllerを再プッシュするにはどうすればよいですか?上記のプッシュとポップを処理するコードを追加しました。何か提案がありますか? – drisse

+0

「再押し」とはどういう意味ですか?これを理解しましたか? – gerry3

5

実際のホーム画面に移動する前に、セットアップ画面としてスタックに複数のVCがあります。

私は私はこのように動作するようになった:

HomeViewController *hvc = [[HomeViewController alloc] init]; 
[self.navigationController pushViewController:hvc animated:YES]; 
self.navigationController.viewControllers = [[NSArray alloc] initWithObjects:hvc, nil]; 

私はHomeViewControllerを押した後、唯一のホーム画面を持つようにスタックを書き換えます。

関連する問題