12

スタックに 3 つの UIViewController を含む UINavigationController があります。

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に設定しても、ビューCには戻るボタンが表示されません。どうすればこれを解決できますか?

4

8 に答える 8

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
于 2011-02-21T06:11:51.940 に答える
7

View Controllerをプッシュまたはポップして次のView Controllerに影響を与える前に、そのプロパティを設定する必要があると思います。viewWillAppearで現在のviewcontrollerに設定するのは遅すぎます。

編集: これは 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 があり、グローバル設定ではないため、戻るボタンを元に戻すためにわざわざ元に戻す必要はありません (少なくとも、設定されている VC に戻る場合)。 "いいえ")。

于 2011-02-21T05:45:20.223 に答える
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 でバグがなくなったようです。

注: バグは修正されたように見えますが、戻るボタンの表示と非表示をアニメーション化できる「空のビュー」手法を好みます。

于 2011-03-10T04:42:15.443 に答える
1

この問題の解決策はややトリッキーです。同じ問題に直面したので、試してみてください。

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

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

他のページに移動するときは、ナビゲーション タイトルを null に設定するだけです。これにより、上部にボタンが表示されなくなります 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];
}
于 2011-02-26T18:23:45.163 に答える
0

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

再編集:

これで試してみてください、それは私のために働きました:

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    self.navigationItem.hidesBackButton = NO;
}
于 2011-02-25T21:33:01.650 に答える
0

ビュー階層が本当に、ビュー B には戻るボタンを表示すべきではなく、ビュー C には戻るボタンを表示すべきである場合、これを回避する最も簡単な方法は、階層をリファクタリングすることです。次の代替案を考えています。

ビュー A は、プロパティがビュー B であるビュー B* を呼び出します。ビュー B* は、ビュー B からのイベント (またはそれ以外) に応答して、ビュー C をそのナビゲーション スタックにプッシュしますpresentModalViewController:animated:。ビュー A で。ビュー B* と C の状態をメモリに保持したい場合は、ビュー B* への別のポインターをどこかに保持して、閉じたときに消えないようにすることもできます。UINavigationControllerviewdismissModalViewControllerAnimated:

于 2011-03-02T01:39:13.507 に答える
0

次のサンプル コードも使用できます。

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

- (void) viewWillDisappear:(BOOL)animated{
    self.navigationItem.hidesBackButton = NO;
}
于 2011-03-01T17:46:01.920 に答える
0

UINavigationControllerDelegate メソッドを使用します-navigationController:willShowViewController:animated:。これをビュー コントローラ A とビュー コントローラ B に実装します。A では、ビュー コントローラ B に設定-hidesBackButton:YES、代わりにに設定しNOます。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.hidesBackButton = YES;
}
于 2011-03-01T02:37:35.557 に答える