UINavigationController の UIToolBar で Button 表示を切り替えたいメモ
UINavigationController.navigationItem.toolbar のボタンを、押すたびに表示を切り替えたい
という そのまんま。
やりたいのは、こんなの↓
1.初期表示
2.編集ボタンクリック後
・UIToolbarのアイテム(ボタン)を切り替える
http://seiichirou.jp/2011/03/07/uitoolbarのアイテム(ボタン)を切り替える/
おお!やってる人いるじゃーん♪
で、やってみました。
ちなみに前提として、対象のViewController は、UINavigationController の RootView です。
BeforeViewController.m
-(void) transitNextView { ToolbarViewContoller *toolbarViewController = [[ToolbarViewContoller alloc] init]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:toolbarViewController]; // 遷移 [self presentModalViewController:navigationController animated:YES]; }
ToolbarViewContoller.m
- (void)viewDidLoad { [super viewDidLoad]; [self setBarButtonItems1]; } // ボタン1を設定 - (void) setBarButtonItems1 { UIBarButtonItem *barButtonItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:self action:@selector(buttonEvent1:)]; // animated:YESでItemを設定する [self.navigationController.toolbar setItems:[NSArray arrayWithObjects:barButtonItem1, nil] animated:YES]; // (1) self.navigationItem.leftBarButtonItem = barButtonItem1; } // ボタン2を設定 - (void) setBarButtonItems2 { UIBarButtonItem *barButtonItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(buttonEvent2:)]; // animated:YESでItemを設定する [self.navigationController.toolbar setItems:[NSArray arrayWithObjects:barButtonItem1, nil] animated:YES]; self.navigationItem.leftBarButtonItem = barButtonItem1; } // ボタン1が押された時のアクション - (void) buttonEvent1:(id)sender { NSLog(@"buttonEvent1"); // Toolbarのアイテムをボタン2に変える [self setBarButtonItems2]; } // ボタン2が押された時のアクション - (void) buttonEvent2:(id)sender { NSLog(@"buttonEvent2"); // Toolbarのアイテムをボタン1に変える [self setBarButtonItems1]; }
えっと、、、、ダメ。orz
確かに、初期表示はエディットマークのボタンになる。
で、それを押すと、エディットマークは消えずに、ブックマークが重なった状態。
ログは、ボタン押すたびに それぞれのイベントを通っとります。
2012-06-18 16:22:24.056 sample1[4982:11603] buttonEvent1
2012-06-18 16:22:30.244 sample1[4982:11603] buttonEvent2
2012-06-18 16:22:31.605 sample1[4982:11603] buttonEvent1
なので、本家本元のリファレンス。
・UINavigationItem Class Reference
https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UINavigationItem_Class/Reference/UINavigationItem.html#//apple_ref/occ/cl/UINavigationItem
なんか よく分からん、これだけじゃ。
こんな時は、StackOverFlow!
てことで探してみると、ありました!!
・button item lost when hide and unhide toolbar
http://stackoverflow.com/questions/2432312/button-item-lost-when-hide-and-unhide-toolbar
↑回答:6 により、上記ソースはこのように。
ToolbarViewContoller.m
// ボタン1を設定 - (void) setBarButtonItems1 { UIBarButtonItem *barButtonItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:self action:@selector(buttonEvent1:)]; // animated:YESでItemを設定する [self setToolbarItems:[NSArray arrayWithObjects:barButtonItem1, nil] animated:YES]; // (2) } // ボタン2を設定 - (void) setBarButtonItems2 { UIBarButtonItem *barButtonItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(buttonEvent2:)]; // animated:YESでItemを設定する [self setToolbarItems:[NSArray arrayWithObjects:barButtonItem1, nil] animated:YES]; }
(1) を (2) に変えました。
変更前
[self.navigationController.toolbar setItems:[NSArray arrayWithObjects:〜
変更後
[self setToolbarItems:[NSArray arrayWithObjects:〜
やりました!
StackOverFlow のコメントには、
"The documented method for setting toolbar items is via the toolbarItems property of the view controller.
The same UINavigationController Reference also lists the toolbar property as read-only and specifically warns."
てある。UINavigationController の ToolBar は、表示専用のオブジェクトだから みたいね。
最初のサンプルは、UINavigationController を使用せず、UIView にUIToolBar をインスタンスして
セットしてるから、あれで良かったんだ。
とりあえず、オッケーってことで♪