なんとなく

忘備録です

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

確かに、初期表示はエディットマークのボタンになる。
で、それを押すと、エディットマークは消えずに、ブックマークが重なった状態。

1.初期表示


2.ボタン押した後

ログは、ボタン押すたびに それぞれのイベントを通っとります。

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:〜


1.初期表示

2.ボタンクリック後

やりました!

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 をインスタンスして
セットしてるから、あれで良かったんだ。

とりあえず、オッケーってことで♪