Questo non è il modo corretto, chiamare init
su un oggetto già inizializzato raramente (non credo mai).
Il modo in cui ho risolto questo problema consiste nel creare una sottoclasse di UINavigationController.
In questa sottoclasse, i sovrascrivere il 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;
}
Il fakeRootViewController realtà non fa nulla, è una soluzione per IOS non avere una possibilità di impostare la RootViewController.
In un'altra funzione (setRootViewController: aViewController) si nasconde il backbutton del nuovo 'rootviewcontroller' in modo che l'utente non veda mai un falso rootviewcontroller. e spingerlo sopra la fakerootviewcontroller
Il poptorootviewcontroller deve essere sovrascritto per assicurarsi che appare sempre all'indice 1 della pila, non indice 0.
Il getter di viewcontrollers dovrebbe essere modificata in modo che restituisce un array senza the fakerootviewcontroller (removeobjectatindex: 0
)
Spero che questo aiuti!
Grazie Costique! Funziona. Per favore, spiega come funziona setViewController? –
Entrambi i metodi sostituiscono l'intero stack del controller di visualizzazione all'interno del controller di navigazione. I "vecchi" controller vengono rilasciati. Lo stack array inizia con il controller di root e il suo ultimo elemento è il controller di visualizzazione più in alto. – Costique
@Costique Come posso impostare Root ... supponiamo di dover cambiare root 3 volte, allora questo metodo funzionerà in modo efficiente o no? – Dalvik