标签栏控制器引发NSInternalInconsistencyException

时间:2009-07-10 10:19:05

标签: iphone iphone-sdk-3.0

在我的基于SDK 3.0核心数据的应用中,我有一个标签栏控制器管理4个标签。有时,显然是随机的,当我启动应用程序时,它会崩溃并显示以下消息:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因是:'不允许直接修改由标签栏控制器管理的标签栏。'

但是,除了以下内容之外,我没有在代码中修改任何选项卡。实际上,选项卡中的所有导航控制器或控制器都是使用IB设置的,在我的代码中我已经声明其中两个作为出口,因为我需要在我的app delegate applicationDidFinishLaunching()方法中访问它们来设置它们的核心数据managedObjectContext如下:

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

这不正确吗?如果是这样,为什么?

我在网上看到的问题的唯一参考是:

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

但是,即使在IB中从头开始删除并重新创建标签栏控制器,问题仍然存在。

有任何线索吗? 提前谢谢。

3 个答案:

答案 0 :(得分:5)

我也遇到过这个问题。您是否有笔记中的UITabBar本身(而不是UITabBarController)?当我删除它时,我没有遇到问题。

对不起,这不是100%可靠的解释,但是这种解决方法为我解决了这个问题。

答案 1 :(得分:1)

我已经多次获得此异常,尤其是在使用本地化更改内容时。清理目标然后重建似乎解决了这个问题。

答案 2 :(得分:1)

我快速编写了以下类,并从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
}

干杯!