2012-01-19 13 views
5

Uso iOS 5 con Storyboard. Il mio UITabBar viene creato utilizzando Interface Builder. Ho due elementi simili nel mio TabBar che è lo stesso elenco, solo con diversi tipi di elementi in esso. Quello che ho fatto, ma sembra strano per me, è impostare un "Tag" diverso per ogni UITableView e nel viewDidLoad, e quindi assegnare il tipo giusto in base al Tag.UITabBar - due viste (pennino) stessa classe utilizzando Storyboard

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (self.tableView.tag == 1) 
    { 
     type = @"lent"; 
    } 
    else if (self.tableView.tag == 2) 
    { 
     type = @"borrowed"; 
    } 
} 

Qual è il modo migliore per farlo? Non sto creando il mio codice UITabBar, quindi il mio AppDelegate è praticamente vuoto! Il tipo I impostato è solo un attributo in una delle mie entità di dati di base, in una lista che ho preso in prestito articoli e nell'altra ho articoli in prestito, ma sono la stessa entità.

risposta

3

Si potrebbe esporre il tipo come una proprietà sul controller punto di vista comune, e impostare quando si seleziona la voce barra delle schede in questione (tabBarController:didSelectViewController: dal protocollo UITabBarControllerDelegate - la vostra applicazione delegato sarebbe la barra delle schede di controllo delegato).

Impostare come segue. Dichiara che il tuo delegato dell'app è conforme al protocollo UITabBarControllerDelegate, quindi impostalo come delegato del controller della barra delle schede (devi farlo nel codice poiché il delegato dell'app non è disponibile per connettersi nello storyboard). Nel vostro applicationDidFinishLaunching, aggiungere il seguente prima di tornare SI:

UITabBarController *tbc = (UITabBarController*)self.window.rootViewController; 
tbc.delegate = self; 

quindi implementare il seguente metodo delegato:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 

    switch (tabBarController.tabBar.selectedItem.tag) 
    { 
     case 1: 
      viewController.property = @"propertyA"; 
      break; 
     case 2: 
      viewController.property = @"propertyB"; 
      break; 
    } 

    NSLog(@"view controller is %@",viewController); 

} 

sarà necessario il cast della variabile viewController al vostro attuale classe di controller della vista, e assegnare anche i tag pertinenti all'elemento della barra delle schede di ciascun controller di visualizzazione.

+0

Hm, la soluzione sembra carina! Quindi ho semplicemente inserito tabBarController: didSelectViewController: nel mio delegato App? Domani darò uno scatto e ti terremo aggiornato. Grazie! – allaire

+0

È inoltre necessario impostare il delegato dell'app come delegato del controller della barra di tabulazione e dichiarare che il delegato dell'app è conforme al protocollo. – jrturton

+0

Hai un minuto per condividere un piccolo snippet di codice, quello che ho provato non ha funzionato:/ – allaire

1

Quello che hai dovrebbe funzionare bene. Un'altra opzione sarebbe quella di avere una super classe UIViewController comune che abbia tutte le funzionalità e quindi sottoclassi quella classe base e fornisca un'implementazione di viewDidLoad che imposta il tipo appropriato. Quindi in Interface Builder è possibile impostare i controller di visualizzazione UITabBar come sottotipi appropriati.

Il risultato sarebbe lo stesso, ma potrebbe essere un po 'più chiaro in IB cosa sta succedendo perché non è necessario fare affidamento sul ricordare il significato di ciascun tag numerico.

+0

Grazie per il suggerimento :) – allaire

Problemi correlati