1

起動の間に UINavigationController の状態を復元しようとすると、UIBarButtonItem/UINavigationBar の奇妙な動作に遭遇しました。

以下のコード スニペットは、ナビゲーション コントローラーの状態を復元する方法を示しています。このコード スニペットは、viewDidLoadメソッドで実行されます。

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
if ([ud objectForKey:HBStateRestorationQuoteSelection]) {
    NSInteger index = [ud integerForKey:HBStateRestorationQuoteSelection];

    // Fetch Quote
    NSDictionary *quote = [self.quotes objectAtIndex:index];

    // Initialize Quote View Controller
    HBQuoteViewController *vc = [[HBQuoteViewController alloc] initWithNibName:@"HBQuoteViewController" bundle:[NSBundle mainBundle]];
    vc.quote = quote;

    // Push Quote View Controller Onto Navigation Stack
    [self.navigationController pushViewController:vc animated:NO];
}

その結果、何らかの理由で戻るボタンのタイトルが切り捨てられます。この動作は、ナビゲーション コントローラーが通常の方法で使用されている場合には発生しません。

切り捨ては、ナビゲーション バーのタイトルのサイズによるものではないことに注意してください。前述したように、この状態復元ロジックを使用しない場合、バック バー ボタンのタイトルは正常に表示されます。

また、 viewWillAppearメソッドに復元コードを入れたり、カスタム バック バー ボタンを作成してバック バー ボタンのタイトルを変更したりしてみましたが、いずれも問題が解決しません。

ここに画像の説明を入力

4

1 に答える 1

1

親がビューを表示する前にコントローラーを押すことが問題の原因であると思われます。少し手間がかかりますが、次のことである程度の成功を収めることができると思います。

  • 状態を復元する場合は、ルート ビュー コントローラーのナビゲーション バーを非表示にし、通常のコンテンツの代わりに起動イメージを表示します。

  • ルートView Controllerが「viewDidAppear」を取得したら、メインキューでディスパッチブロックを使用し、ナビゲーションバーを非表示にして起動画像を表示するように構成された他のコントローラーをプッシュします。

  • 表示されるSUPPOSEであるView Controllerに到達したら、その時点で実際のビューを表示し、ナビゲーションバーの表示を有効にします。

これは、システムが行っていることを多かれ少なかれ行うための圧縮された方法であり、別のビューをプッシュする前に常に親ビューが少なくとも「viewDidAppear」に到達するようにします。

于 2012-07-22T14:08:02.740 に答える