2009-05-01 5 views
4

内蔵アドレス帳を模倣しようとしています。具体的には、連絡先を編集したり、電話アプリ内から既存の連絡先の情報を表示したりするときの動作です。別のタブに移動すると、編集状態がリセットされ、[新しい連絡先]または[情報]ビューがポップされ、連絡先タブに戻ると、ルートテーブルビューに戻ります。タブバースイッチのルートナビコントローラへのポップアップの問題

私は、setEditing:とpopToViewControllerを使用して、viewWillDisappearの内部でこのような作業をしています。しかし、ユーザーが戻るボタンを使用してInfoビューからテーブルビューにナビゲートすると、異常な動作をします。ルートテーブルビューコントローラにポップしても、デフォルトのUITableViewControllerクラスを使用しているように見えます(サブビューではありません)。

ヒント? IPD

はここで説明するいくつかのコードです:

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // This is to clean up from the colored bar in detail view 
    self.navigationController.navigationBar.tintColor = nil; 

    // These are to match the behaviour of Contacts app 
    [self setEditing:NO animated:NO]; 

    // This is the tricky part: works when switching tabs, but not when back button was going to pop anyway!! 
    [self.navigationController popToViewController:rootViewControllerForTab animated:NO]; 
} 

答えて

5

-viewWillDisappear:メソッドを使用すると、タブを切り替えるとき、それが両方のトリガーされるので、あなたのnavigationControllerためのビューコントローラのスタックを変更するための最高の場所ではなく、ときビューそれの上にプッシュされます。

これで少し遊んで、これに最適な場所は - [UITabBarControllerDelegate tabBarController:didSelectViewController:]メソッドです。したがって、まず、あなたのタブバーの代理人になるオブジェクトを指定する必要があります(私は、アプリケーションデリゲートを使用しました)。 UITabBarControllerのデリゲートプロパティを、コードまたはInterface BuilderでUITabBarControllerDelegateプロトコルを実装するオブジェクトにバインドします。

次に、-tabBarController:didSelectViewController:メソッドを実装します。そのトリックは、あなたの「アドレス帳」タブがいつ切り替わるかを示す方法です。 UINavigationController(タブのルートビューコントローラ)のプロパティを使用して、問題のタブのビューコントローラを追跡しました。 Interface Builderを使用して実際のインスタンスにtab1NavControllerプロパティをバインドした後、これを使用してviewControllerパラメータと比較して、選択したタブを確認できます。

@interface Pop2RootTabSwitchAppDelegate : NSObject 
    <UIApplicationDelegate, UITabBarControllerDelegate> { 
    UINavigationController *tab1NavController; 
} 
@property (nonatomic, retain) IBOutlet UINavigationController *tab1NavController; 
@end 

@implementation Pop2RootTabSwitchAppDelegate 

- (void)tabBarController:(UITabBarController *)tabBarController 
    didSelectViewController:(UIViewController *)viewController { 
    NSLog(@"[%@ tabBarController:%@ didSelectViewController:%@]", [self class], 
     tabBarController, viewController); 
    if (viewController == tab1NavController) { 
     NSLog(@"viewController == tab1NavController"); 
     [tab1NavController popToRootViewControllerAnimated:NO]; 
    } 
} 
+1

これは勝者です...ありがとう! (私は終了時に状態を清掃することに焦点を当てていたし、入力時に状態を設定することは考えていませんでした) – iPhoneDollaraire

+0

アニメーションをNOに設定するとエラーが表示されます。 " - [DetailViewController tableView:cellForRowAtIndexPath:]:割り当てられたインスタンスに送信されたメッセージ" ........任意のアイデア? – cannyboy

関連する問題