Исключение «Изменение делегата панели вкладок» - PullRequest
6 голосов
/ 25 мая 2009

У меня есть приложение, которое отлично работает на iPhone OS 2.2.1, но когда я пытаюсь запустить его на iPhone OS 3.0, оно ломается.

Вот ошибка, которую я получил с консоли:

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

Вероятно, это происходит из-за того, что я программно меняю представление определенного контроллера представления.

Вот код:

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

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

Может ли произойти ошибка в этой части кода, и если да, как я могу это исправить? Почему еще это могло произойти?

Заранее спасибо, Илья.

Ответы [ 6 ]

9 голосов
/ 19 ноября 2012

В большинстве случаев вместо этого вы можете использовать UITabBarControllerDelegate. Он имеет методы, аналогичные UITabBarDelegate, и избегает такого исключения. Например, вместо:


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

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

Вы можете написать:


- (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];
}
4 голосов
/ 22 октября 2009

г. Приведенный выше Эрнст создает впечатление, что он видит в коде Ильи что-то, что представляет собой «вырвать вид из-под Контроллера». Это может заставить вас долго смотреть на код, и проблема не в этом. Я опубликовал эту проблему на форуме разработчиков Apple http://discussions.apple.com/message.jspa?messageID=10259835#10259835, и мне сказали, что NSInternalInconsistencyException - это проблема с файлом .xib (в Интерфейсном Разработчике). Используя эту информацию, я нашел следующее решение. Я думаю, что некоторые из названий, которые я даю здесь, носят общий характер и помогут другим, пытающимся решить эту проблему. Чтобы рассмотреть проблему, ссылка xib компилируется и отлично работает на 2.x, компилируется на 3.x и выдает сообщение об ошибке выше, когда вы пытаетесь запустить приложение в симуляторе 3.0. У меня был делегат в панели вкладок. При просмотре ссылочных выходов в Интерфейсном Разработчике в качестве выходных ссылок были «Несколько», «Владелец файла», «Панель вкладок» и «Контроллер панели вкладок». Когда я удалил «Панель вкладок» из ссылок, мое приложение запустилось в Simulator 3.0. Он также компилировался и работал на 2.x, поэтому ссылка на «панель вкладок» не требовалась 2.x. ... Флэш Гордон

0 голосов
/ 08 января 2012

Я нашел для меня следующее решение:

  1. Подкласс UITabBarController
  2. В Интерфейсном Разработчике установите атрибут «Пользовательский класс> Класс» вашего UITabBar в ваш новый класс
  3. Добавьте следующий код в ваш класс

    -(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];
    } 
    

Надеюсь, это поможет ...

0 голосов
/ 16 сентября 2009

Это нетривиальная проблема. Кто-то должен был опубликовать пример удаления представления из-под ViewController, потому что это сделали многие люди. И, несмотря на все разговоры о том, насколько «плохо» это было, в 2.x все получилось Даже статья о яблоке не имеет отношения к проблеме архитектуры. Большинство людей собираются написать комбинацию .h / .m для обработки каждого представления субконтроллера. Пример яблока, кажется, работает только в файле .m, который контролирует tabbarcontroller.

0 голосов
/ 16 сентября 2009

Я думаю, что это один из руководств, на которые ссылается Адам Эрнст:

http://developer.apple.com/IPhone/library/featuredarticles/ViewControllerPGforiPhoneOS/UsingToolbarControllers/UsingToolbarControllers.html#//apple_ref/doc/uid/TP40007457-CH6-SW1

0 голосов
/ 26 мая 2009

Проще говоря, вы не можете этого сделать. Вытащить вид из-под UIViewController - верный способ получить сбой.

Посмотрите учебники по панели вкладок, которые Apple предоставляет, чтобы увидеть, как это делается правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...