“更改选项卡栏的委托”例外

时间:2009-05-25 19:51:39

标签: iphone cocoa-touch

我有一个完全适用于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 个答案:

答案 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)

答案 4 :(得分:0)

这是一个非常重要的问题。有人必须发布一个从ViewController下删除视图的示例,因为很多人都这样做了。尽管谈论它有多“糟糕”,但它在2.x中起作用。即便是苹果文章也没有涉及架构问题。大多数人都会编写一个.h / .m组合来处理每个子控制器视图。 apple示例似乎只在控制tabbarcontroller的.m文件中运行。

答案 5 :(得分:0)

我找到了以下解决方案:

  1. 子类UITabBarController
  2. 在Interface Builder中,将UITabBar的“Custom Class> Class”属性设置为新类
  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];
    } 
    
  4. 希望这会有所帮助......