/ /このbackBarButtonItemはどこから来ますか? - uinavigationcontroller、pushviewcontroller、backbarbuttonitem

このbackBarButtonItemはどこから来ますか? - uinavigationcontroller、pushviewcontroller、backbarbuttonitem

私はUIViewController(BとC)もあるいくつかのサブビューを持つUINavigationController(A)を持っています。メインのUINavigationController(A)は、UITabViewController(D)の内部に乗っています。

私はB内でビューコントローラをプッシュしようとしています: [self.navigationController pushViewController... etc]

さて、backBarButtonItemは間違ったテキスト。 「戻る」と言うのではなく、単に「アイテム」と言います。これは、私のチェーン内のView Controllerの1つがタイトルを「Item」に設定しているか、まったく同じでないかもしれないからです。

私の質問は、どこから生成されたbackBarButtonItemですか?

ビューコントローラをプッシュする前に、これらのコード行をB内で試してみましたが、どちらも機能しませんでした。

self.presentingViewController.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc

self.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc

self.navigationController.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc

私はこの原則をここで学びたいので、このアイテムがどこから取り込まれているのか、正しい方法は何かを本当に理解することができます。

回答:

回答№1は2

あなたのことを言ってみましょう C コントローラがナビゲーションコントローラのスタックの上にあり、 B コントローラーはその下にあります。例えば。

navigationController.viewControllers = @[ bViewController, cViewController ];

したがって、ナビゲーションコントローラは、 cViewController.view.

ナビゲーションコントローラは、スタック上の2番目のコントローラを使用して戻るボタンを設定します。この場合、 bViewController 戻るボタンを設定します。これはそのアルゴリズムです:

UINavigationItem *navigationItem = bViewController.navigationItem;
UIBarButtonItem *barItem = navigationItem.backBarButtonItem;

if (barItem.image != nil) {
show a back button containing barItem.image;
}

else if (barItem.title != nil) {
if (barItem.title.length > 0) {
show a back button containing barItem.title;
} else {
don"t show a back button;
}
}

else if (navigationItem.title != nil) {
if (navigationItem.title.length > 0) {
show a back button containing navigationItem.title;
} else {
don"t show a back button;
}
}

else {
show a back button containing @"Back";
}