我有一个完全适用于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];
}
可能在这部分代码中发生错误,如果是,我该如何解决? 为什么会发生呢?
提前谢谢你, 伊利亚安德。
答案 0 :(得分:9)
在大多数情况下,您可以使用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];
}
答案 1 :(得分:4)
先生。上面的恩斯特给人的印象是,他在伊利亚的代码中看到的东西构成了“从控制器下面查看视图”。这可能让你长时间盯着代码,而这不是问题的真正原因。我在Apple开发者论坛http://discussions.apple.com/message.jspa?messageID=10259835#10259835上发布了这个问题,我被告知'NSInternalInconsistencyException'是.xib文件的问题(在Interface Builder中)。使用此信息,我找到了以下解决方案。我认为我在这里给出的一些名称是通用的,并会帮助其他人试图解决这个问题。要检查问题,xib引用在2.x上编译并运行完美,在3.x上编译并在尝试在3.0模拟器中运行应用程序时给出上面的错误消息。我在标签栏中有一个代表。在界面生成器中查看引用插座时,我将“多个”,“文件所有者”,“标签栏”和“标签栏控制器”作为引用插座。当我从引用插座中删除“标签栏”时,我的应用程序在模拟器3.0中运行。它还编译并运行2.x,因此2.x.不需要“Tab Bar”引用。 ...... Flash Gordon
答案 2 :(得分:0)
很简单,你做不到。从UIViewController下面查看视图是一个确定的崩溃方法。
查看Apple提供的标签栏教程,了解它是如何正确完成的。
答案 3 :(得分:0)
我认为这是Adam Ernst所指的教程之一:
答案 4 :(得分:0)
这是一个非常重要的问题。有人必须发布一个从ViewController下删除视图的示例,因为很多人都这样做了。尽管谈论它有多“糟糕”,但它在2.x中起作用。即便是苹果文章也没有涉及架构问题。大多数人都会编写一个.h / .m组合来处理每个子控制器视图。 apple示例似乎只在控制tabbarcontroller的.m文件中运行。
答案 5 :(得分:0)
我找到了以下解决方案:
将以下代码添加到您的班级
-(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];
}
希望这会有所帮助......