38

I am setting the title field of a UIViewController via Interface Builder/Storyboard: enter image description here

This view controller is nested in a UINavigationController which in turn is nested within a UITabBarController. When I run the app, I my navigation item has no title, neither does the tab bar item.

If I explicitly set the view controller's navigation item's title, and also it's tab bar item's title in interface builder, then it works just fine.

I am wondering:

a)If I am not using Storyboard but just regular xibs, setting the title of a view controller implicitly sets the navigation items' title as well as the tab bar item's title. But it's not the same storyboard. Is this the intended behaviour?

b) What is then the purpose of the view controller's title (in Storyboard)? it seems to have no effect.

Thanks!

4

10 に答える 10

20

ステップ1

Xcode の Interface Builder で Xib を見ている場合は、[ドキュメント アウトライン] パネル (左から 2 番目のパネル) を見てください。ナビゲーション項目というラベルの付いたアイコンが見つかるまで、作業中のView Controllerを展開します。

ナビゲーション項目を表示するドキュメント アウトライン パネル

ステップ2

次に、Navigation Item を強調表示して Utilities パネル (一番右端) を開き、Attributes Inspector をクリックすると、View Controller のタイトルを設定できる場所が表示されます。これは、コードを介して行うのではなく、Interface Builder で行う方法です。

ビュー コントローラのタイトルを設定する方法を示すユーティリティ パネル

于 2015-06-18T00:37:57.060 に答える
3

今朝、この問題に遭遇しました。これが私が取った刺し傷と最終的な回避策です。

これは、ストーリーボードに設定されている子ビュー コントローラーのタイトルを正しく記録しますが、表示される内容には影響しません。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"Title: %@", self.title);
}

これは効果がありません。タイトルはまだ表示されません (おそらく "if (![_title isEqualToString:title]){}" ユーザーをフード:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = [self.title copy];
}

これにより、タイトルが正しく設定されます。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *title = self.title;
    self.title = nil;
    self.title = title;
}

私の推測では、UINavigationController は、ストーリーボードから読み込まれる前に表示されるビューのタイトルを取得していますが、プロパティが設定されるまで変更のリッスンを開始しません。ただし、私は絵コンテやニブをあまり使用しないので、私が見逃したこの隠し場所に魔法のチェックボックスがある可能性は十分にあります.

いずれにせよ、回避策として self.navigationItem.title = self.title ダンス、または上記のいずれかを実行し、IB でタイトルを維持できるようです。

これに関するAppleのドキュメントはちょっと明確です:

ナビゲーション コントローラーは、ナビゲーション バーの中央を次のように更新します。

  • 新しい最上位ビュー コントローラーにカスタム タイトル ビューがある場合、ナビゲーション バーには、デフォルトのタイトル ビューの代わりにそのビューが表示されます。カスタム タイトル ビューを指定するには、View Controller のナビゲーション項目の titleView プロパティを設定します。

  • カスタム タイトル ビューが設定されていない場合、ナビゲーション バーにはビュー コントローラーのデフォルト タイトルを含むラベルが表示されます。このラベルの文字列は通常、View Controller 自体の title プロパティから取得されます。ビュー コントローラに関連付けられているものとは異なるタイトルを表示する場合は、代わりにビュー コントローラのナビゲーション アイテムの title プロパティを設定します。

鉱山を強調します。

于 2013-11-29T18:07:14.837 に答える
0

別の動作が予想されますが、設計どおりに機能すると思います。title プロパティを- (void)viewDidLoadに出力すると、ストーリー ボードで設定した値と同じになるため、Apple の選択がない限り、これが機能しない理由はわかりません。

于 2013-09-27T20:36:06.790 に答える
0

上記の方法をすべて試しましたが、手動でナビゲーション バーを追加しようとしましたが、役に立ちませんでした。

これが私のために働いたものです。

ビュー コントローラーに手動で追加したナビゲーション バー項目を削除し、これをviewDidLoadメソッドに追加します。

self.navigationController.navigationBar.topItem.title = @"My Title";

また

self.navigationController.topViewController.title = @"My Title";
于 2015-08-24T08:46:21.010 に答える
0

私の場合、これで解決します:

    [self.tabBarController.navigationItem setTitle:@"My Title"];
于 2016-02-17T00:42:02.113 に答える