Панель вкладок Контроллер, вызывающий NSInternalInconsistencyException - PullRequest
1 голос
/ 10 июля 2009

В моем приложении на основе основных данных SDK 3.0 у меня есть контроллер панели вкладок, управляющий 4 вкладками. Время от времени, по-видимому, случайно, когда я запускаю приложение, оно вылетает со следующим сообщением:

Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Непосредственное изменение панели вкладок, управляемой контроллером панели вкладок, недопустимо».

Однако я не изменяю в своем коде ни одну из вкладок, за исключением следующих. На практике все навигационные контроллеры или контроллеры на вкладках были настроены с использованием IB, и в моем коде я объявил два из них как выходы, так как мне нужно получить к ним доступ в методе делегата приложения applicationDidFinishLaunching () для настройки их ядра. Данные managedObjectContext выглядят следующим образом:

 [self managedObjectContext];
 [self managedObjectModel];
 [self persistentStoreCoordinator];
 [rootViewController retain];
 rootViewController.managedObjectContext = self.managedObjectContext;

Разве это не правильно? Если так, то почему?

Единственная ссылка на проблему, которую я видел в Интернете, находится здесь:

http://discussions.apple.com/thread.jspa?messageID=9716886

Однако проблема все еще сохраняется даже после удаления и повторного создания контроллера панели вкладок с нуля в IB.

Есть подсказка? Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 10 июля 2009

У меня тоже была эта проблема. Есть ли у вас выход к самому UITabBar (не UITabBarController) в наконечнике? Когда я удалил это, у меня прекратились проблемы.

Извините, это не на 100% достоверное объяснение, но этот обходной путь прояснил проблему для меня.

1 голос
/ 05 августа 2011

Я быстро написал следующий класс, и показ / скрытие вкладок в UITabBarController работало как по волшебству:

TabBarDesigner.h

#import <Foundation/Foundation.h>
@interface TabBarDesigner : NSObject 
{

}

+(void) setTabBarController:(UITabBarController *)tabBarController
                      items:(NSArray *)tabBarItems 
            viewControllers:(NSArray *)viewControllers;

+(void) removeItemsInRange:(NSRange) range;

@end

TabBarDesigner.m

#import "TabBarDesigner.h"

static NSArray *_tabBarItems = NULL;
static NSArray *_viewControllers = NULL;
static UITabBarController *_tabBarController = NULL;

@implementation TabBarDesigner

+(void) setTabBarController:(UITabBarController *)tabBarController
                      items:(NSArray *)tabBarItems 
            viewControllers:(NSArray *)viewControllers
{
    if (tabBarItems && viewControllers && tabBarController)
    {
        if ([tabBarItems count] == [viewControllers count])
        {
            [_tabBarItems release];
            [_viewControllers release];
            _tabBarItems = [tabBarItems copy];
            _viewControllers = [viewControllers copy];
            _tabBarController = tabBarController;
        }
    }
}

+(void) removeItemsInRange:(NSRange) range
{
    if (_tabBarController)
    {
        if ( range.location < ([_tabBarItems count] - 1) )
        {
            if ( (range.length + range.location) < [_tabBarItems count] )
            {
                NSMutableArray *tabBarItems = [_tabBarItems mutableCopy];   
                [tabBarItems removeObjectsInRange:range];
                NSMutableArray *viewControllers = [_viewControllers mutableCopy];
                [viewControllers removeObjectsInRange:range];
                [_tabBarController setViewControllers:viewControllers];
                 NSUInteger i;
                for (i = 0; i< [viewControllers count]; i++) 
                {
                    UIViewController *vC = [viewControllers objectAtIndex:i];
                    vC.tabBarItem.image = [[tabBarItems objectAtIndex:i] image];
                    vC.tabBarItem.title = [[tabBarItems objectAtIndex:i] title];
                    vC.tabBarItem.tag = [[tabBarItems objectAtIndex:i] tag];
                }

                [tabBarItems release];
                [viewControllers release];

            }


        }
    }
}


@end

Пример использования этого класса: В вашем MyAppDelegate.m

#import "TabBarDesigner.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [TabBarDesigner setTabBarController:_tabBarController
                                  items:[_tabBarController.tabBar items] 
                        viewControllers:[_tabBarController viewControllers]];
    // remove the first 3 tabs
    [TabBarDesigner removeItemsInRange:NSMakeRange(0,3)];
    // show all tabs
    [TabBarDesigner removeItemsInRange:NSMakeRange(0,0)];
    // continue with your code
}

Ура!

1 голос
/ 28 августа 2009

Я получал это исключение несколько раз, особенно когда что-то менялось с локализацией. Очистка целей, а затем перестройка, кажется, обойдут проблему.

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