2009-05-25 13 views
6

Mam aplikację, która doskonale działa na iPhone OS 2.2.1, ale kiedy próbuję uruchomić go na iPhone OS 3.0, to miażdży."Zmiana delegata paska kart" wyjątek

Oto błąd mam z konsoli:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Changing the delegate of a tab bar managed by a tab bar controller is not allowed.' 

Prawdopodobnie występuje, ponieważ jestem zmieniając widok pewnego kontrolera widoku programowo.

Oto kod:

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

    self.view = current_controller.view; 
    [current_controller viewWillAppear: NO]; 
    [current_controller viewDidAppear: NO]; 
} 

Może wystąpić błąd w tej części kodu, a jeśli tak to w jaki sposób można to naprawić? Po co to możliwe?

Z góry dziękuję, Ilya.

Odpowiedz

4

Pan Ernst powyżej sprawia wrażenie, że widzi coś w kodzie Ilyi, który "wyrywa widok spod kontrolera". To może spowodować, że będziesz patrzył na kod przez długi czas i to nie jest tak naprawdę problem. Wysłałem ten problem na Forum programistów Apple http://discussions.apple.com/message.jspa?messageID=10259835#10259835 i powiedziano mi, że "NSInternalInconsistencyException" jest problemem z plikiem .xib (In the Interface Builder). Korzystając z tych informacji, znalazłem następujące rozwiązanie. Myślę, że niektóre z tych nazwisk, które tu podaję, są ogólne i pomogą innym próbować naprawić ten problem. Aby przejrzeć problem, odnośnik Xib kompiluje się i działa idealnie na 2.x, kompiluje się na 3.x i podaje komunikat o błędzie powyżej podczas próby uruchomienia aplikacji w symulatorze 3.0. Miałem delegata na pasku kart. Przeglądając gniazda referencyjne w narzędziu do tworzenia interfejsów, jako punkt odniesienia korzystałem z "wielu", "właściciela pliku", "paska kart" i "kontrolera paska kart". Kiedy usunąłem "Pasek zakładek" z gniazd referencyjnych, moja aplikacja działała w Symulatorze 3.0. Została również skompilowana i uruchomiona na 2.x, więc odwołanie do "Tab paska" nie było wymagane przez 2.x. ... Flash Gordon

+0

To jest dokładnie to, co mam zrobić! :) –

0

Po prostu nie możesz tego zrobić. Wyszukanie widoku spod kontrolera UIViewController jest pewnym sposobem na awarię.

Spójrz na samouczki dotyczące paska kart, które oferuje Apple, aby sprawdzić, jak jest on prawidłowo wykonany.

0

To nie trywialny problem. Ktoś musiał opublikować przykład usunięcia widoku spod kontrolki ViewController, ponieważ zrobiło to wiele osób. I pomimo całej gadki o tym, jak "złe" było, działało w 2.x. Nawet artykuł z jabłkiem nie zajmuje się problemem architektury. Większość ludzi zamierza napisać kombinację .h/.m do obsługi każdego widoku kontrolera. Przykład apple wydaje się działać tylko w pliku .m, który kontroluje kontroler tabbar.

0

Znalazłem następujące rozwiązanie dla mnie:

  1. podklasa UITabBarController
  2. W konstruktorze Interface ustawić "Class niestandardowy> Class" Atrybut swojego UITabBar do swojej nowej klasy
  3. Dodaj następujący kod do klasy

    -(void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray *)items{ 
        id modalViewCtrl = [[[self view] subviews] objectAtIndex:1]; 
        if([modalViewCtrl isKindOfClass:NSClassFromString(@"UITabBarCustomizeView")] == YES) 
         ((UINavigationBar*)[[modalViewCtrl subviews] objectAtIndex:0]).tintColor = [UIColor blackColor]; 
    } 
    

Mam nadzieję, że to pomoże ...

7

W większości przypadków można użyć UITabBarControllerDelegate zamiast tego. Ma podobne metody do UITabBarDelegate i unika takiego wyjątku. Dla, przykładowo, zamiast:


- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 

    int index = [tabBar determinePositionInTabBar:item]; // custom method 
    [tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 

można napisać:


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

    UITabBarItem *item = [tabBarController.tabBar selectedItem]; 
    int index = [tabBarController.tabBar determinePositionInTabBar:item]; // custom method 
    [tabBarController.tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 
+1

Ładna alternatywa (Y) –

Powiązane problemy