2009-05-25 69 views
6

我有一個應用程序可以在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]; 
} 

可發生在這部分代碼錯誤,如果是我該如何解決? 爲什麼還會發生?

謝謝你, 伊利亞。

回答

4

上面的恩斯特先生給人的印象是,他看到伊利亞代碼中的某些東西構成了「從控制器下取景」。這可能讓你長時間盯着代碼,而這不是問題的真正原因。我在Apple Developer Forum 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所要求的。 ...飛俠哥頓

+0

這正是我做了! :) – 2009-11-17 06:23:37

0

很簡單,你不能這樣做。從UIViewController下取出視圖是一個肯定的方式來獲取崩潰。

請看Apple提供的標籤欄教程,瞭解它是如何正確完成的。

0

這是一個不平凡的問題。有人必須發佈一個從ViewController下刪除視圖的例子,因爲很多人都這樣做了。儘管所有關於它有多「糟糕」的討論都是在2.x中運行的。即使是蘋果的文章也沒有涉及架構問題。大多數人會寫一個.h/.m組合來處理每個子控制器視圖。蘋果示例似乎只在控制tabbarcontroller的.m文件中操作。

0

我發現我以下解決方案:

  1. 子類的UITabBarController
  2. 在Interface Builder中設置的「自定義類>類」您UITabBar的屬性爲新的類
  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]; 
    } 
    

希望這有助於...

7

在大多數情況下,您可以使用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

不錯的選擇(Y) – 2016-01-30 04:18:12