13

スタックに3つのUIViewControllerを含むUINavigationControllerがあります。UINavigationController:1つのビューで戻るボタンを非表示にするすべてのビューでそれを隠す

View A - is the root 
View B - is pushed by View A and has `self.navigationItem.hidesBackButton = YES;` 
View C - is pushed by View B and has `self.navigationItem.hidesBackButton = NO;` 

hidesBackButtonをNOに設定しても、View Cには戻るボタンが表示されません。どうすれば解決できますか?

+0

ビューBのタイトルを教えてください。 –

+0

View B - self.title = @ "お得" –

+0

\ Alamあなたはアップルにバグを報告するか、サポートを求めるメールをドロップしてください。 –

答えて

15

アップデートは
それは4.1のSDK

までの作品として4.2で可能なバグが私はこれを試してみましたと私は完全に取り組んでいます。私はちょうどBビューコントローラ(BVC)とCビューコントローラ(CVC)の実装を投稿しています。私の最初の推測では、あなたはBVCのタイトルをviewDidLoadに設定していないということです。

@implementation BVC 


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.title = @"I am B"; 
} 


- (void) viewWillAppear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = YES; 
} 

- (IBAction)pushB:(UIButton *)sender{ 
    CVC *cvc = [[CVC alloc] initWithNibName:@"CVC" bundle:nil]; 
    [self.navigationController pushViewController:cvc animated:YES]; 
    [cvc release]; 
} 
@end 

@implementation CVC 

- (void) viewWillAppear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = NO; 
} 
@end 
+0

+1、それは私を助けましたが、実際に私はすべてのビューのためにそれを隠す必要がありますが、私はそれを行うことができません。 ( – mAc

0

戻ってきたら(それをやっている間に)hidesBackButtonプロパティをYESにリセットします。たとえば、あなたのviewWillAppear:方法では、

@implementation SomeViewController 

- (void) viewWillAppear:(BOOL)animated { 
    self.navigationController.navigationItem.hidesBackButton = YES; 
    [super viewWillAppear:animated]; 
} 

@end 

ような何かを、私はそれがそのような単純なものだろうが、私は間違っている可能性が把握します。結局のところ、ナビゲーション項目はUINavigationControllerが所有しているので、UINavigationControllerのスタックにあるUIViewControllerに応じて、変更内容を保存/復元することはできません。

+0

私はそれを試みました、残念ながら、それは動作しません。 –

+0

自分で試してみましたが、同じことが起こっています。今私はちょうど混乱している。 – nil

+0

私の答えを見てください。 –

8

の前にをプッシュまたはポップすると、次のビューコントローラに影響するようにビューコントローラがプッシュまたはポップされ、viewWillAppearの現在のビューコントローラの設定が遅すぎます。

編集:これは4.2のバグのようです!戻るボタンは、4.2シミュレータと4.2デバイスの両方で隠されたままですが、3.2、4.1、および4.0シミュレータで動作します。

ここに戻って隠されたボタンでVCを押してコードです:

- (IBAction) goto2nd 
{ 
    SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease]; 
    vc.navigationItem.hidesBackButton = YES; 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

必要とすべきことは、すべてで、各VCは独自のnavigationItemを持って、「それはグローバルな設定ではありませんので、あなたはドン(少なくとも「NO」に設定されているVCにポップバックするときは)戻るボタンを元に戻すのをやめなければなりません。

+0

まだ運がありません。プッシュ前に 'viewB.navigationItem.hidesBackButton = YES'を実行し、' viewC.navigationItem.hidesBackButton = NO'をプッシュする前に幸運なしに実行しました。 –

+0

同じことを見ています - 変わった、それを見て – Bogatyr

+0

4.2バグ! – Bogatyr

0

私は同じ問題を実行しています。これはiOS 4.2シミュレータでのみ発生しているので、恐らくそのバージョンのバグです。

再編集:

はこれで試してみてください、それは私の仕事:

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 
    self.navigationItem.hidesBackButton = NO; 
} 
1

をこの問題の解決策は、多少tricky..justでも、私は同じ問題に直面しているので、それは確実に動作することを試しています。

最初に設定したナビゲーションタイトルはviewWillAppearです。

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.navigationItem.title = @"SET YOUR TITLE"; 
} 

あなたがちょうどあなたのtop.Sinceあなたのいずれかのボタンは表示されませんnull.Thisにごナビゲーションのタイトルを設定し、他のページに移動している self.navigationItem.hidesBackButton = YES;毎回書き込みを取り除くことができます。

- (IBAction)pushB:(UIButton *)sender 
{ 
    SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease]; 
    self.navigationItem.title = @""; 
    [self.navigationController pushViewController:vc animated:YES]; 
    [vc release]; 
} 
0

UINavigationControllerDelegate方法-navigationController:willShowViewController:animated:を使用してください。あなたは

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    viewController.hidesBackButton = YES; 
} 
0

あなたはまた、サンプルコード次使用することができますビューコントローラBに-hidesBackButton:NOからYESにして、代わりに設定しますAでは、ビューコントローラAとビューコントローラBでこれを実装します。

- (void) viewWillAppear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = YES; 
} 

- (void) viewWillDisappear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = NO; 
} 
0

ビューの階層構造が本当にそのような場合にはビューBがはバックボタンを示すが表示C べきべきではないこと、そしてこれを回避する最も簡単な方法は、あなたの階層構造をリファクタリングすることです。私は、次の代替を考えています:

ビューAはビューB *、そのviewプロパティビューB.ビューB *は、イベント(またはその他)に応答して、そのナビゲーションスタック上に表示CをプッシュされUINavigationControllerpresentModalViewController:animated:を呼び出しますビューBから戻る場合は、 に戻る必要がある場合は、すぐにAを表示し、次にビューAにdismissModalViewControllerAnimated:を呼び出します。ビューB *とCの状態をメモリに保持したい場合は、ビューB *それは解雇されたときに消えない。

6

ここでは、4.3で正常に使用している回避策があります。

代わりの戻るボタンを隠し、空のビューに左バーのボタンの表示を設定します。戻るボタンを復元するには

UIView *tmpView = [[UIView alloc] initWithFrame:CGRectZero]; 
UIBarButtonItem *tmpButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tmpView]; 
[tmpView release]; 
self.navigationItem.leftBarButtonItem = tmpButtonItem; 
[tmpButtonItem release]; 

、ちょうどnilに左バーのボタンの項目を設定します。

[self.navigationItem setLeftBarButtonItem:nil animated:YES]; 

アップデート:4.3でバグがなくなったようです。

注:バグは修正されているように見えますが、戻るボタンの消滅と再現を可能にするため、「空のビュー」手法が好まれます。

+0

)このアプローチでは、[<戻る]ボタンは完全に削除されますが、navigationItem.hidesBackButtonは矢印を非表示にして残りのテキストを無効にします。 – HBublitz