5

tworzę moje NAV i umieszczenie zakładek w kodzie przy uruchomieniu poprzez: IN: myAppDelegate.mKiedy "programowo" tworzenia UINavigationController i UITabBarController, w jaki sposób rozwiązać swoje funkcje (jak viewWillAppear?)

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    // set up a local nav controller which we will reuse for each view controller 
    UINavigationController *localNavigationController; 

    // create tab bar controller and array to hold the view controllers 
    tabBarController = [[UITabBarController alloc] init]; 
    NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:4]; 

    // setup the first view controller (Root view controller) 
    RootViewController *myViewController; 
    myViewController = [[RootViewController alloc] initWithTabBar]; 

    // create the nav controller and add the root view controller as its first view 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 

    // add the new nav controller (with the root view controller inside it) 
    // to the array of controllers 
    [localControllersArray addObject:localNavigationController]; 

    // release since we are done with this for now 
    [localNavigationController release]; 
    [myViewController release]; 

    // setup the first view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil]; 
    resortsListViewController.title = @"Category1"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image1.png"]; 
    [email protected]"Category1"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

    // setup the second view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil]; 
    resortsListViewController.title = @"Category2"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image2.png"]; 
    resortsListViewController.navigationItem[email protected]"Category2"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

    // setup the third view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil]; 
    resortsListViewController.title = @"Category3"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image3.png"]; 
    [email protected]"Category3"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

    [resortsListViewController release]; 

    // load up our tab bar controller with the view controllers 
    tabBarController.viewControllers = localControllersArray; 

    // release the array because the tab bar controller now has it 
    [localControllersArray release]; 

    // add the tabBarController as a subview in the window 
    [window addSubview:tabBarController.view]; 

    // need this last line to display the window (and tab bar controller) 
    [window makeKeyAndVisible]; 


} 

As widzisz, ponownie używam ResortsListViewController dla różnych wyświetlaczy kategorii (ośrodki z plażami, ośrodki z basenami, ośrodki z barami espresso) ... teraz, nie nękając mnie (grin) o głupotę moich kategorii (bo to jest test app) Potrzebuję zrobić kilka rzeczy:

  1. Potrzebuję być w stanie wiedzieć, które kliknięcie tabulacji spowodowało wyświetlenie ResortsListViewController. Miałem nadzieję użyć TAG, ale "initWithRootViewController" nie ma kontrolki "tag". Tak więc, jeśli użyję nazwy pliku obrazu, który jest nazwą kategorii, mogę użyć tej nazwy pliku, aby odróżnić kategorie ... lub nawet nazwę navigationItem. Muszę wiedzieć, czy istnieje sposób, aby ResortsListViewController wiedział, które kliknięcie elementu tabla spowodowało jego wyświetlenie. Pomyślałem, aby wyszukać "akcję", którą mógłbym przypisać do elementu tabbar, ale to nie działa w ten sposób, że działa tabbarcontroller.

  2. Po kliknięciu z jednej karty na drugą widok rzeczywiście się zmienia, tytuł zmiany ResortsListViewController zmienia się itp., Ale trzymany w ten sposób widok TABLEVIEW nie powoduje wyczyszczenia i wyświetlenia żadnych nowych danych. Wyszukiwanie w internecie znalazłem Możliwe rozwiązanie:

http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0

zasadzie mówiąc:

Aby UINavigationControllers wysłać "viewWill/Czy/Pojawiają/Disappear" wiadomości , musi otrzymać "viewWill/Did/Appear/Disappear" z swojego kontenera.

Co to jest kontener dla moich kontrolerów UINavigation w tej sytuacji? myAppDelegate jest zdefiniowana w pliku .h jako:

NSObject <UIApplicationDelegate, CLLocationManagerDelegate> 

i nie mają:

- (void)viewWillAppear:(BOOL)animated { 
} 

sekcję. Kiedy dodaję jeden, mówi "NSObject może nie odpowiadać -viewWillAppear" w debugerze.

Każda pomoc tam dostępna?

Odpowiedz

1

OK, tutaj: jest poprawną odpowiedzią na pytanie, jednak nie było tak trudne. Wszystko, co musiałem zrobić, to:

Utwórz właściwość w obiekcie ResortViewController typu int o nazwie zmiennej whichChoice (na przykład). Następnie rozwiązać go w konfiguracji z TabBarController restauracja a la:

// setup the first view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc]  initWithNibName:@"ResortsListView" bundle:nil]; 
    // START HERE IS THE CHANGE 
    resortsListViewController.whichChoice = 1; 
    // END HERE IS THE CHANGE 
    resortsListViewController.title = @"Category1"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image1.png"]; 
    [email protected]"Category1"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

Aby dowiedzieć się, która karta została kliknięciu kiedy mój resortsListViewController przejmuje, ja po prostu kwerendy zmienną klasy: whichChoice aby uzyskać odpowiedź.

Rzeczy takie jak te są tak proste, że można je pominąć. Pomyślałem, że musisz przekazać zmienną w akcji i określić, gdzie byłaby ona z obiektem docelowym, tak jak robisz to w innych obiektach - ale kiedy ustawisz rzeczy przed czasem, nie musisz tego robić. Teraz, po powiedziawszy to, dynamiczne ustawienie "whichChoice" nie jest takie proste bez większego zastanowienia ... ale ustawienie na zmienną ZNANE przy konfiguracji jest w porządku.

Dla odpowiedzi # 2, po prostu ustawiłem styl IBOutlet w mojej klasie, podłączyłem go do stołu, a następnie postępowałem zgodnie z Twoimi instrukcjami, ponieważ bez zmiennej w IBOutlet i podłączeniu jej do stołu, tam nie ma odniesienia do widoku tabeli. Z jakiegoś powodu podpięcie stołu po prostu na WIDOK "Odwołanie referencji" i wywołanie [self.tableview reloadData] nie wykonało zadania.

Ale w większości odpowiedzi były słuszne i doprowadziły mnie we właściwym kierunku. Na marginesie, naprawdę nienawidzę tego, że musisz kliknąć prawym przyciskiem myszy i przeciągnąć od tutaj do miejsca w IB, jeśli masz element IB, który zbudowałeś. Powinieneś być w stanie podłączyć go do kodu używając ObjectId (lub czegoś takiego). To byłoby bardziej zgodne z programistami. Wiem, że IB jest programowany, aby umożliwić programowanie, aby być łatwiejszym dla projektantów, ale gee wilikers ... trudno jest mi o tym myśleć! Kończę upuszczając IB i tworząc elementy w kodzie w większości czasu ... które nie wiem czy jest tak szybki do wykonania. Staram się myśleć nie ... ale nie mam dowodów, że jest inaczej.

2

1) Jest to dość proste. Musisz ustawić właściwość delegata dla kontrolera UITabBarController. Ustawiłbyś to na obiekcie kontrolera, który jest właścicielem twojego kontrolera tabbar (lub delegata twojej aplikacji, jeśli to twoja konfiguracja). Niezależnie od tego, obiekt jest ustawiony jako delegat będzie wtedy otrzymują:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

I

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

zarządzać wyboru zakładki. Umieść jedną z tych metod w implementacji dowolnego obiektu, który ustawisz jako delegata (chcesz, aby był to obiekt będący właścicielem wszystkich kontrolerów).

2) Jeśli masz UIViewController, który pojawia się jako wybór zakładki (np ResortsListViewController) wtedy musiałby umieścić viewWillAppear metody w realizacji kontrolera siebie:

@implementation ResortsListViewController 

- (id)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle { 
... 
} 

... etc. .... 

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
[table reloadData]; 
} 

... 

@end 

Niech mnie wiem, czy źle zrozumiałem drugą część twojego pytania.

+0

Spróbuję tego. Dam ci znać w AM (niedziela). Druga część jest nieco myląca, ponieważ mogę dodać viewWillAppear XCode nie będzie automatycznie uzupełniany i ostrzega, że ​​"myAppDelegate" może nie odpowiadać -viewWillAppear. Rozumiesz? – Jann

+0

Twoja aplikacjaDelegate nie powinna odpowiadać na viewWillAppear, jeśli jest to obiekt NSObject (tak jak w dowolnym standardowym szablonie Xcode). Wspominałeś: ResortsListViewController * resortsListViewController. Plik, w którym jest zaimplementowany, jest miejscem, w którym chcesz umieścić swoją metodę viewWillAppear. –

-1

proszę odwiedzić How to add UINavigationController Programmatically

proszę odwiedzić powyżej linku & uzyskać wszystkie informacje dotyczące UINavigationController.

+1

To nie jest przydatne.Aby utworzyć powyższy przykład, faktycznie przeczytałem dokumenty. Nie wyjaśniają w pełni, o co prosiłem. – Jann

+0

Próbuję tylko wyjaśnić podstawy. Proszę mi powiedzieć, na co patrzę? Muszę ci pomóc. – niceamitsingh

Powiązane problemy