1

異なるビュー間を移動した後または移動中にボタンを非表示にせずに、カスタム画像をUINavigationBarの背景として使用する方法についての十分な良い例を見つけました。しかし、私には答えがないように思われる次の問題があります。

ルートコントローラーとしてUITabBarViewControllerオブジェクトがあり、それぞれがルートコントローラーとしてUITableViewControllerオブジェクトで初期化されたサブビュー(タブごとに1つ)としていくつかの異なるUINavigationControllersオブジェクトを追加しました。各テーブルビューから、選択したセルに関するより詳細な情報を表示する子コントローラーに移動できます。今私が抱えている問題は次のとおりです。

各テーブルビューのナビゲーションコントローラーで、カスタムの背景画像を設定しました。これは、UINavigationBarのdrawRectメソッドを上書きすることによって行われます。ユーザーが各テーブルビューの詳細ビューに移動するときは、画像を詳細ビューのタイトルに置き換える必要があります。これは、グローバル変数を使用して実現し、すべてのビューの各viewWillAppearメソッドでこれを更新し、上書きされたdrawRectメソッド内でif条件を使用します。したがって、これをいくつかのコードで説明するには、次のようにします。

アプリデリゲート.h.fileで、外部変数を次のように宣言します。

extern BOOL displayImage;

アプリデリゲート.mファイルで、外部変数を次のように初期化します。

BOOL displayImage = TRUE;

すべてのViewControllerに対して、viewWillAppearメソッドは次のように実装されます。

// View where I want to show the image in the navigation bar
- (void)viewWillAppear:(BOOL)animated {
   ...

   self.navigationItem.title = nil;      // No title
   displayImage = TRUE;
   [self.navigationController.navigationBar setNeedsDisplay];

   ...
} 

// View where I do NOT want to show the image in the navigation bar
- (void)viewWillAppear:(BOOL)animated {
   ...

   self.title = @"Info";
   displayImage = FALSE;
   [self.navigationController.navigationBar setNeedsDisplay];

   ...
}

// Overwritten drawRect method of UINavigationBar
- (void)drawRect:(CGRect)rect {
   if (displayImage) {
      // Code that draws the image by calling drawInRect
   } else {
      // Code that just sets a black background
   }
}

これは、テーブルビューから詳細ビュー(テーブルビューの子コントローラー)に移動して、親ビューに戻るときにうまく機能します。ただし、詳細ビューからタブバーの別のタブに移動すると、詳細ビ​​ューのタイトルが消えて画像が再表示されます(これまでのところ良好です)が、詳細ビューを保持しているタブに戻ると、詳細ビューのタイトルは表示されますが、画像は消えません(つまり、タイトルと画像の両方がナビゲーションバーに表示されます)。この状況では、setNeedsDisplayメソッドが呼び出されていないようです。このすべての間に、外部変数は正しく更新されます。

私がここで間違っているかもしれないことを教えてくれる人はいますか?

ありがとう

4

1 に答える 1

0

私も同じ状況でした。問題が発生している場合は、異なるタブを切り替えてもナビゲーション バーの画像が消えません。したがって、通常の画像と黒の画像の 2 つの画像を作成する必要があります。

カテゴリの drawrect メソッドの else 部分で黒色を設定する代わりに、黒色の画像を使用します。また、次のページで変数を設定する代わりに、ページから切り替えるときにviewWillDisappearの変数をリセットします。あなたの問題が解決するかもしれません。

于 2011-09-22T05:53:35.877 に答える