2012-04-19 7 views
17

Ich habe Navigation die als modalview präsentiert wird und deren RootViewController ist FirstViewController.At irgendwann sagen, dass ich RootViewController von Navigation ändern möchten SecondViewController.What ich habe istWie ändere ich rootviewcontroller von NavigationController?

[self.navigationController initWithRootViewController:SecondViewController]; 

Ich bin nicht sicher, was ich tat, ist richtig und ob FirstViewController freigegeben wurde oder nicht? Bitte weiß jemand, was die richtige Vorgehensweise ist?

Vielen Dank im Voraus!

Antwort

40

Sie entweder

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

oder

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

wo firstViewController ist eine Instanz FirstViewController und secondViewController ist eine Instanz SecondViewController Klassen sind. Die letztere Variante ist eine Abkürzung für setViewControllers:animated: ohne Animation.

+0

Dank Costique machen! Es funktioniert. Können Sie bitte erklären, wie setViewController funktioniert? –

+4

Beide Methoden ersetzen den gesamten View-Controller-Stack im Navigationscontroller. Die "alten" Controller werden freigegeben. Das Stack-Array beginnt mit dem Root-Controller und das letzte Element ist der oberste View-Controller. – Costique

+0

@Costique Wie kann ich Root setzen ... nehme ich an, ich muss root 3 mal ändern, dann wird diese Methode effizient funktionieren oder nicht? – Dalvik

0

Dies ist nicht der richtige Weg, init auf einem bereits initialisierten Objekt selten (ich denke nie) aufrufen.

Die Art, wie ich dieses Problem löste, ist eine Unterklasse von UINavigationController zu erstellen.

In dieser Unterklasse überschreiben i die 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; 
} 

Die fakeRootViewController eigentlich nichts tut, ist es eine Abhilfe für iOS nicht die Möglichkeit, die RootViewController einstellen zu müssen.

In einer anderen Funktion (setRootViewController: aViewController) verstecken Sie die Rückschaltfläche des neuen 'rootviewcontroller', so dass der Benutzer nie sieht, dass es einen gefälschten rootviewcontroller gibt. und schieben Sie es dann über dem fakerootviewcontroller

Die poptorootviewcontroller sollten überschrieben werden, um sicherzustellen, dass es immer knallt auf Index 1 des Stapels, nicht Index 0.

Der Getter von Viewcontrollers geändert werden soll, so dass es ein Array zurückgibt, ohne der fakerootviewcontroller (removeobjectatindex: 0)

Hope dies hilft!

+0

Die Antwort von @Costique setzt nur den Navigationscontroller des rootviewcontrollers. Das wird Sie mit einem Stapel innerhalb eines Stapels usw. verlassen. In meinem Fall brauchte ich Unterstützung für popToRootViewController (mit einem Tabbaritem), also funktionierte das nicht für mich. – Jacco

0

Sie müssen benutzerdefinierte 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]; 
} 

Initialisierung

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

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

Schreiben Sie etwas Inhalt, der Ihre Antwort erklärt. – Hemang

+0

Dadurch werden alle Einstellungen entfernt, die Sie im ursprünglichen navigationController hätten haben können. – Antenehs

0

Swift 3

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

    } 
Verwandte Themen