2011-12-23 9 views
1

いくつかの計算を行っているビューがあり、この間にbackButtonを非表示にしたいとします。UINavigationBarでbackButtonの表示を動的に変更する

私は背中のボタンを持つ新しいコントローラを開いて、Aボタンをキャンセルするためにこれを使用します。

[self.navigationController pushViewController:calcController animated:YES]; 

これは、すべてのメインスレッドで、私は計算を開始する方法である:

- (void)startSth { 
    self.viewMode = modeRunning; 
    [self updateButtons]; 
    [self performSelector:@selector(doSth) withObject:nil afterDelay:0.1]; 
} 

- (void)doSth { 
    ... 
    self.viewMode = modeFinished; 
    [self updateButtons]; 
} 

これはボタンの表示を切り替える方法です:

- (void)updateButtons { 
    BOOL busy = (self.viewMode==modeRunning); 
    self.navigationItem.hidesBackButton = busy; //back button 
    self.navigationItem.rightBarButtonItem.enabled = !busy; //cancel button 
} 

問題:最初は期待どおりに動作し、ボタンは非表示になり、再び表示されます。 戻るボタンをクリックすると、ビューがポップされます。 2回目の実行では、ボタンが最初から実行されていません。メソッドupdateButtonsが2回呼び出され、変数self.viewModeが記録され、ビジーで正しい動作(最初は1回目と0回目)が表示されるため、明らかにhidesBackButtonの呼び出しは機能しません。

また、カスタムの空のボタンを使用して、setNeedsDisplayまたはsetHidesBackButton:animated :,すべてを成功させることなく、navigationItem.backButtonの設定をnilにした例を試しました。

アイデア?

答えて

0

見つけたもの:空のleftBarButtonを設定すると、backButtonが非表示になります。誰かがより洗練されたソリューションを持っているのでしょうか?

if(busy) 
    { 
     [self.navigationItem setLeftBarButtonItem:[[[UIBarButtonItem alloc] initWithCustomView:[[UIView new] autorelease]] autorelease] animated:NO]; 
    } 
    else 
    { 
     [self.navigationItem setLeftBarButtonItem:nil animated:NO]; 
    } 
関連する問題