2012-01-05 8 views
5

Penso che questo sia un caso molto comune come ho visto in diverse app. Ma dopo aver trascorso un paio di giorni, sto ancora lottando con questo. Ho una struttura come la seguente:Come dealloc uiviewcontroller/scaricare viste sull'esecuzione di logout

UITabBarController 
-- UINavigationController1 
---- UITableViewController1 

-- UINavigationController2 
---- UITableViewController2 

Ora ho un pulsante di disconnessione su UITableViewController2. Quando clicco su quel pulsante di disconnessione, voglio che tutti e tutti i viewcontroller siano deallocati, tutte le viste sono scariche. Fondamentalmente inizia fresco come avviare l'app. Fondamentalmente voglio che viewDidLoad su ognuno di quelli UITableViewController chiamato di nuovo.

Ho provato il seguente metodo per essere chiamato nel mio appdelegate quando viene eseguita l'azione di disconnessione su UITableViewController2.

-(void) logout { 
    for (UINavigationController* ctrl in self.tabBarController.viewControllers) { 
     [ctrl popToRootViewControllerAnimated:NO]; 
     ctrl.visibleViewController.view = nil; 
    } 

[self.tabBarController.view removeFromSuperview]; 
[self.window addSubview:self.tabBarController.view]; 

}

Ma, ahimè, non sembra funzionare?

Qualche idea su come una cosa del genere viene realizzata? Inoltre vedo comportamenti diversi in iOS4 vs iOS5 con visibleViewController. Non sto usando nessun viewalino modale qui. Qualche trucco?

Update: non sto usando ARC

grazie mbH

+0

Non sono sicuro che funzionerà esattamente per il tuo caso, ma volevo semplicemente "popToRootViewController' al logout, nel qual caso mi piace molto [l'idea di Adam Kemp] (http://forums.xamarin.com/discussion/3749/popviewcontroller-all-the-way-to-main-screen-of-app-rootviewcontroller), che suggerisce di aggiungere un evento 'NSNotificationCenter' per' UserDidLogOut' e gestire quell'evento ** all'interno ** dei tuoi controller di visualizzazione. – cloudrave

risposta

1

È necessario rilasciare i controller di vista. Quando viene chiamato il loro metodo di rilascio, quel metodo dovrebbe includere istruzioni per rilasciare tutte le risorse dell'oggetto (e anche dealloc la sua superclasse).

+0

Come ottengo ciò? [rilascio ctrl.visibleViewController]? non funziona. [ctrl release]? ha provato anche quello. – mbh

+0

Stai usando ARC? La risposta potrebbe essere diversa se lo sei. – Jim

+0

grazie per averlo indicato. dovrebbe aver menzionato. aggiornata la domanda dicendo che NON sto usando ARC – mbh

1

Il rootViewController per entrambi i controller di navigazione sono i rispettivi controller TableView. Quindi non penso che popToRootViewController possa fare qualsiasi cosa.

Probabilmente è necessario reimpostare i dati e aggiornare le viste invece di deallocare le viste.

+0

Ho più TableViewControllers. Quindi ho usato UINavigationController. Così Pop ha aiutato a dealloc tutti gli altri viewcontrollers tranne quelli root/top. Dove sto avendo il problema di non essere in grado di dealloc – mbh

+0

È possibile dealloc ogni controller di visualizzazione ad eccezione del controller di visualizzazione radice, dal momento che si desidera avere almeno un controller di visualizzazione per ricaricare tutti gli altri controller. –

2

Il ciclo for rilascerà e quindi dealloc qualsiasi controller di vista che è stato inserito nelle rispettive radici di UINavigationController (a seconda di quante schede si hanno), ovvero in quanto queste non avranno una superview quando si torna alla radice di ciascun controller di navigazione, questi sono deallocati automaticamente. Questi sono i tuoi UITableViewControllers presi in considerazione.

Per quanto riguarda i rispettivi UINavigationControllers, è necessario il proprio controller tabbar per rilasciare la vecchia istanza. IMHO, questo dovrebbe essere fatto per te quando rilasci UITabBarController.

Questo lascia quindi lo stesso UITabBarController. Non penso che possa essere fatto da te. Il tuo codice rimuoverà solo la vista, ma non dealloc il controller tabbar stesso. E come sottolinea Krishna K, è necessario almeno un controller di visualizzazione per ricaricare tutti gli altri. Inserire il codice nell'appdelegate ha senso, ma è necessario assicurarsi che il logout() non causi un mantenimento su UITableViewController2 e sul UITabbarController come viene chiamato da UITableViewController2 da qualche parte.

Un'idea da esplorare, il tuo AppDelegate contiene un'istanza per il TabBar-Controller che potresti rilasciare e creare una nuova istanza dopo aver rimosso la vista da self.window?

// manually create UITabBarController - AppDelegate holds instance 
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil]; 
} 

- (void) logout { 
    [self.tabBarController.view removeFromSuperview]; 
    [mytabcontroller release]; 
    mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil]; 
    [self.window addSubview:self.tabBarController.view]; 
} 

Ma come ho detto, ci potrebbero essere avvertimenti con gestione della memoria a questo punto.