在我的基于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中从头开始删除并重新创建标签栏控制器,问题仍然存在。
有任何线索吗? 提前谢谢。
答案 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
}
干杯!