2012-02-15 8 views
1

私はUITabbarCoo = ntrollerアプリケーションを持っています。私はオブザーバーを追加し、通知を待っています。私はタブバーの項目に触れたときに通知を受け取っていませんでした。タブバーのアイテムに触れたときに通知が届かない

[self.tabBarController addObserver:self forKeyPath:@"selectedIndex" options:NSKeyValueObservingOptionNew context:@"changedTabbarIndex"]; 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
NSString *action = (NSString*)context; 
if([action isEqualToString:@"changedTabbarIndex"]) 
    { 
    } 
} 
+0

これはあなたの質問に直接答えませんが、UITabBarControllerのデリゲートとして自分自身を宣言し、選択したビューコントローラの変更に応答するために "tabBarController:didSelectViewController:"を実装できない理由がありますか? – nickbona

+0

まあ、1つは、あなたのコードがプログラムによってタブバーの内容を変更したときに呼び出されないということです。それを別々に処理する必要がないのが便利でしょう。 –

答えて

3

私は同じことに気づいた。私はこれがUITabBarController実装のバグだと考えています。 selectedIndexの代わりにselectedViewControllerというキーパスを使用すると、KVO通知が発生することに注意してください。

ただし、注意してください。ユーザが "詳細"タブを選択したときにあなたのUITabBarControllerがUIMoreNavigationController( "詳細"タブの場合)KVO通知を受け取ると、が子ビューコントローラを選択したときに通知を受け取りませんUIMoreNavigationControllerのこれは、UIMoreNavigationControllerが別のView Controllerであるため、子ビューコントローラの1つを選択すると、UITabBarControllerのselectedViewControllerは変更されません。実際はUIMoreNavigationControllerのtopViewControllerが変更されています。

あなたはUITabBarControllerのselectedViewControllerプロパティに加えてUIMoreNavigationControllerのtopViewControllerプロパティを観察することができればそれは素晴らしいことだが、このプロパティはKVO通知がどちらか発射させるように表示されません。ただし、は、UIMoreNavigationControllerでデリゲートを設定し、navigationController:didShowViewController:animated:メソッドを実装できます。

概要: UITabBarControllerのselectedViewController性質を観察し、そしてアプリケーションが「もっと」タブを持っている場合は、タブバーコントローラのmoreNavigationControllerプロパティにデリゲートを設定します。

+0

http://openradar.appspot.com/radar?id=1588404 – erikprice

+0

注:プログラムでタブを変更すると、KVO通知が行われないようです。 –

+0

@croaldそれはかなり標準です。プロパティがプログラムによって変更された場合、KVO通知は多くのUIKitビュー/ビューコントローラプロパティに対して起動されません。一般的には、プロパティが変更されていることを既に知っているからです。時には痛みですが、特定の種類のフィードバックループを防止します。 – erikprice

関連する問題