2012-03-04 9 views
3

私は各コントローラにボタンを追加する方法を知っています。ナビゲーションコントローラのスタックに押し込みます。 しかし、コントローラがプッシュまたはポップされても、ナビゲーションバーの右上には常に設定ボタンが必要です。ボタンは、設定viewControllerをモーダルで表示する必要があります。は、ボタンをUINavigationControllerスタック全体に持続させる方法ですか?

私には、各コントローラのviewDidLoadにはボタンのコードと設定コントローラのヘッダーを含むコードが含まれています。

ナビゲーションコントローラ自体からこのボタンを挿入して、ナビゲーションコントローラのセレクタを指し示すことができるようです。そして、このメソッドは、その時点でスタック内でアクティブになっているコントローラーを介して、settingsControllerをモーダルに表示します。

これを達成するためのアイデアはありますか?

答えて

3

これは私がやったことです:

あなたのアイデアのための

- (void)shouldPresentSettingsView 
{ 
    SetupViewController *settingsView = [[SetupViewController alloc] init]; 
    UINavigationController *tempController = [[UINavigationController alloc]initWithRootViewController:settingsView]; 
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                    style:UIBarButtonItemStylePlain 
                    target:self 
                    action:@selector(shouldDismissSettingsView)]; 
    settingsView.navigationItem.leftBarButtonItem = cancelButton; 
    [self.visibleViewController presentModalViewController:tempController animated:YES]; 

    [cancelButton release]; 
    [settingsView release]; 
    [tempController release]; 
} 

- (void)shouldDismissSettingsView 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 
2

あなたのナビゲーションコントローラのデリゲートを、アプリケーションデリゲートのようなグローバルに設定します。そのオブジェクトには、UIBarButtonItemを初期化し、インスタンス変数に保存します。

...

- (void)navigationController:(UINavigationController *)aNavigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    viewController.navigationItem.rightBarButtonItem = settingsBarButton; 
} 

をし、ボタンアクションを扱う:

- (void)setupSettingsButton 
{ 
    settingsBarButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
                     target:self 
                     action:@selector(openSettings)]; 
} 

そして、それがプッシュされる前に、各View ControllerのnavigationItemを設定[OK]を

- (void)openSettings 
{ 
    [navigationController presentViewController:settingsVC animated:YES completion:NULL]; 
} 
+0

感謝:1 - --pushViewController:aniamted:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { [super pushViewController:viewController animated:animated]; UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc]initWithTitle:@"Settings" style:UIBarButtonItemStylePlain target:self action:@selector(shouldPresentSettingsView)]; [viewController.navigationItem setRightBarButtonItem: settingsButton]; [settingsButton release]; } 

3オーバーライドする - の2つのメソッドを追加サブクラスUINavigationControllerとは、私の設定コントローラ

2のヘッダーが含まれます。しかし、その間に私は新しい視点をナビゲーションコントローラに限定しておくので、デザインの観点からはもっと適切かもしれないと思う別のアプローチ(私の答えを見てください)を思いつきました。しかし、ええ、私は意味...コンセプトに恵まれて、私はあなたのポイントを見て、また、これは "デリゲート"タスクだと主張することができます。 – SaldaVonSchwartz

+0

ええ、そうです。私は一般に継承よりも委譲と合成を優先しますが、私はこのビューコントローラのコードの外側からプッシュされたビューコントローラのnavigationItemを変更しているので、この場合はどちらも設計上問題があると思います。最も正しい*方法は、常にこのボタンを表示するUIViewControllerのサブクラスを持つことです。とにかくこの時点で髪を分割しています。あなたがうまく働いてうれしい。 – joerick

+0

私は間違っているかもしれませんが、私は実際にViewControllersが自分のナビゲーション項目を変更してはいけないということを実際に聞いたと思います。私が推測する考えは、完璧な世界では、View Controllerはナビゲーションコントローラーのコンテキスト内に存在する可能性があることさえ知りません。だから、 "プッシャー"(新しい用語はここに...単にプッシャーとプッシーのコンセプトを構成しました:p)プッシーのナビゲーションアイテムの設定、プッシュ前、コントローラは次のコントローラの設定について知っておく必要があります。 – SaldaVonSchwartz

関連する問題