2012-01-19 9 views
5

Używam iOS 5 z Storyboard. Moja UITabBar jest tworzona przy użyciu Kreatora interfejsu. Mam dwie podobne pozycje w mojej TabBar, która jest tą samą listą, tylko z innym typem przedmiotu. To, co zrobiłem, ale wydaje mi się dziwne, polega na ustawieniu innego "Tag" na każdym UITableView i viewDidLoad, a następnie przypisaniu odpowiedniego typu do tagu.UITabBar - dwa widoki (nib) w tej samej klasie przy użyciu storyboardu

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

Lepszy sposób na zrobienie tego? Nie tworzę mojego UITabBar w kodzie, więc mój AppDelegate jest całkiem pusty! Ustawiony przeze mnie typ jest po prostu atrybutem w jednej z moich jednostek danych podstawowych, na liście, którą mam Pożyczone przedmioty, a na drugiej mam przedmioty Wielkopostne, ale są one tym samym bytem.

Odpowiedz

3

Użytkownik może wystawić typ jako właściwość we wspólnym kontrolerze widoku i ustawić go po wybraniu odpowiedniego elementu paska karty (tabBarController:didSelectViewController: z protokołu UITabBarControllerDelegate - delegat aplikacji będzie delegatem kontrolera paska kart).

Ustawiłbyś to w następujący sposób. Zadeklaruj, że delegat aplikacji jest zgodny z protokołem UITabBarControllerDelegate, a następnie ustaw go jako delegata kontrolera paska tabulatora (musisz to zrobić w kodzie, ponieważ nie można połączyć się z aplikacją w interfejsie). W swojej applicationDidFinishLaunching, dodać następujące przed powrotem TAK:

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

Następnie wdrożyć następujące metody Delegat:

- (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); 

} 

musisz rzucić zmiennej viewController do rzeczywistego widoku klasie kontrolera, a również przypisz odpowiednie znaczniki do elementu paska kart każdego kontrolera widoku.

+0

Hm, rozwiązanie wygląda ładnie! Tak po prostu umieścić tabBarController: didSelectViewController: w moim delegata aplikacji? Zrobię to jutro rano i będę na bieżąco informować. Dzięki! – allaire

+0

Należy również ustawić delegata aplikacji jako delegata kontrolera paska kart i zadeklarować, że delegat aplikacji jest zgodny z protokołem. – jrturton

+0

Czy masz chwilę, aby udostępnić mały fragment kodu, co próbowałem nie działa:/ – allaire

1

To, co tam masz, powinno działać dobrze. Inną opcją byłoby posiadanie wspólnej super klasy UIViewController, która ma wszystkie funkcje, a następnie podklasę tej klasy bazowej i zapewnia implementację viewDidLoad, która ustawia odpowiedni typ. Następnie w Interface Builder można ustawić kontrolery widoku UITabBar jako odpowiednie podtypy.

Wynik byłby taki sam, ale w IB może być nieco bardziej zrozumiałe, co się dzieje, ponieważ nie trzeba polegać na zapamiętywaniu znaczenia każdego znacznika numerycznego.

+0

Dzięki za sugestię :) – allaire

Powiązane problemy