2009-05-25 7 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]; 
} 

エラーコードのこの部分で、私はそれを修正することができますかはい場合に発生する可能性がありますか? それ以外はどうしてですか?

ありがとうございます。 Ilya。

答えて

4

上記のエルンスト氏は、「コントローラーの下からの視界を引き出す」アイラのコードに何かを見ているという印象を与えている。それはあなたが長い間コードを見つめている可能性があります。それは問題が本当にどこにあるのか分かりません。この問題はApple Developer Forum http://discussions.apple.com/message.jspa?messageID=10259835#10259835に掲載されました。「NSInternalInconsistencyException」は.xibファイルの問題です(Interface Builderで)。この情報を使用して、私は以下の解決策を見つけました。私はここに挙げた名前のいくつかは一般的なものだと思って、この問題を解決しようとしている人たちに助けを与えるでしょう。問題を確認するために、xibリファレンスは2.xで完全にコンパイルおよび実行され、3.xでコンパイルされ、3.0シミュレータでアプリケーションを実行しようとすると、上記のエラーメッセージが表示されます。私は、タブバーにデリゲートを持っていました。 Interface BuilderでReferencing Outletsを表示する際、参照するアウトレットとして「Multiple」、「File's Owner」、「Tab Bar」、「Tab Bar Controller」がありました。 Referencing Outletsから「Tab Bar」を削除したとき、私のアプリはSimulator 3.0で動作しました。また、2.xでコンパイルして実行したので、「Tab Bar」のリファレンスは2.xでは必要ありませんでした。 ...フラッシュゴードン

+0

私が行っている正確に何が! :) –

0

簡単に言えば、それはできません。 UIViewControllerの下からビューを外していると、クラッシュする確実な方法です。

アップルが提供するタブバーのチュートリアルを見て、どのように正しく行われているか確認してください。

0

。誰かがViewControllerの下からビューを削除する例を投稿しているに違いありません。そしてそれがいかに悪いかについてのすべての話にもかかわらず、それは2.xで働いた。アップルの記事でさえアーキテクチャの問題は扱わない。ほとんどの人は、各サブコントローラービューを扱う.h/.mの組み合わせを書くつもりです。リンゴの例は、tabbarcontrollerを制御する.mファイルでしか動作しないようです。

0

私は私のために、次の解決策が見つかりました:Interface Builderで

  1. サブクラスUITabBarController
  2. 新しいクラスにごUITabBarの "カスタムクラス> class" 属性を設定します

    あなたのクラスに次のコードを追加し

    -(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) –