2012-04-19 13 views
17

私はmodalviewとして提示し、そのrootviewcontroller私は私がやったSecondViewController.WhatするnavigationControllerのrootviewcontrollerを変更するいくつかのポイントがNavigationControllerのrootviewcontrollerを変更するには?

[self.navigationController initWithRootViewController:SecondViewController]; 

あるFirstViewController.Atを言っているされてnavigationControllerは私が私がやったことは正しいことを確認していないしていますFirstViewControllerがリリースされたかどうかは問われません。これを行う正しい方法は何ですか?

ありがとうございます!

答えて

40

行いいずれか

[firstViewController.navigationController setViewControllers: [NSArray arrayWithObject: secondViewController] 
                animated: YES]; 

又はfirstViewControllerは、それぞれ、FirstViewControllersecondViewControllerのインスタンスであるSecondViewControllerクラスのインスタンスである

firstViewController.navigationController.viewControllers = [NSArray arrayWithObject: secondViewController]; 

。後者はアニメーションのないsetViewControllers:animated:のショートカットです。

+0

おかげCostiqueに行う必要があります!それは働いています。あなたはsetViewControllerのしくみを説明できますか? –

+4

両方のメソッドは、ナビゲーションコントローラ内のView Controllerスタック全体を置き換えます。 "古い"コントローラがリリースされます。スタック配列はルートコントローラで始まり、最後の要素は最上位のビューコントローラです。 – Costique

+0

@Costiqueどのように私はルートを設定することができます...私は3回、このメソッドは効率的に動作するかどうかを変更する必要がありますか? – Dalvik

0

これは正しい方法ではありません。既に初期化されているオブジェクトでinitを呼び出すことはめったにありません。

この問題を解決する方法は、UINavigationControllerのサブクラスを作成することです。 fakeRootViewControllerが実際に何もしないこのサブクラスで

は、私がinitwithrootviewcontroller:

- (id) initWithRootViewController:(UIViewController *)rootViewController 
{ 
    UIViewController *fakeController = [[[UIViewController alloc] init] autorelease]; 

    self = [super initWithRootViewController:fakeController]; 
    if(self) 
    { 
     self.fakeRootViewController = fakeController; 
     rootViewController.navigationItem.hidesBackButton = YES; 

     [self pushViewController:rootViewController animated:NO]; 
    } 
    return self; 
} 

を上書きし、それは、iOSがrootviewcontrollerを設定する可能性を持っていないための回避策です。

別の関数(setRootViewController:aViewController)では、新しい 'rootviewcontroller'のバックボタンを隠すので、ユーザーは偽のrootviewcontrollerが存在することはありません。そしてその後poptorootviewcontrollerを確認し、それは常に、それはせずに配列を返すようviewcontrollersのゲッターを変更すべきスタックのインデックス1ではなくインデックス0

にポップするために上書きされるべきである

fakerootviewcontroller上方に押し込みfakerootviewcontroller(removeobjectatindex: 0

これは役に立ちます。

+0

@Costiqueの答えは、rootviewcontrollerのナビゲーションコントローラのみを設定します。これは、スタックなどの中でスタックを残します。私の場合、私はpopToRootViewController(tabbaritem)をサポートする必要があったので、これは私にとってはうまくいきませんでした。 – Jacco

0

はカスタムUINavigationController

@interface mySwitchRootViewNavigationController() 

@property (nonatomic, retain) myFirstViewController * FirstViewController; 
@property (nonatomic, retain) mySecondViewController * SecondViewController; 

@end 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.FirstViewController = [[myFirstViewController alloc] init]; 
    self.SecondViewController = [[mySecondViewController alloc] init]; 
} 

-(void) setRootViewControllerWithID:(int) viewControllerID 
{ 
    if (viewControllerID == 1) { 
    self.viewControllers = [NSArray arrayWithObject:self.SecondViewController]; 
    } else 
    { 
    self.viewControllers = [NSArray arrayWithObject:self.FirstViewController]; 
    } 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self setRootViewControllerWithID:intVar]; 
    [super viewWillAppear:animated]; 
} 

初期

mySwitchRootViewNavigationController * switchView = [mySwitchRootViewNavigationController alloc] init]; 
1
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController { 

    UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController]; 
    [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}  
+4

答えを説明する内容を書きます。 – Hemang

+0

これにより、元のnavigationControllerに設定されていたすべての設定が削除されます。 – Antenehs

0

スウィフト3

fileprivate func changeRootVC() { 
     if let newVC = self.storyboard?.instantiateViewController(withIdentifier: "MyStoryboardID"), let nc = self.navigationController { 
      nc.setViewControllers([newVC], animated: true) 
     } 

    } 
関連する問題