0

ユーザーが選択したテーマ オプションをアプリに追加しました。関連する各要素 (主に UIView) は、NSUserDefaults BOOL の状態に応じて条件付きで外観を変更します。

これは、#define に続いてビルドと実行を使用して状態を設定していたときに問題なく機能しました。ただし、ユーザーがスイッチを切り替えたときに UI を「更新」する必要があります。

理論的には、setNeedsDisplay を self.window からカスケードする必要があると思います。これを達成するスマートな方法はありますか。以下のリンクで @mattmook のソリューションを使用して subViews を調べてみましたが、それでは十分ではなく、私がやろうとしていることを達成するための最良の方法であるかどうかはわかりません。

iPhone プログラミング setNeedsDisplay が機能しない

誰かがこれが最良の方法であることを確認するか、より簡単なものを提案できますか?

ありがとう、スティーブ

4

3 に答える 3

2

関心のあるビューに通知をリッスンさせます。データが変更されたら、通知を送信し、すべてのビューが更新されるようにします。

一般に、このような機能は分散化する方がよいでしょう。

于 2013-06-14T17:46:13.260 に答える
0

それは、実際に色の変更をどのように適用するかによって異なります。使用している各 UIView オブジェクトをサブクラス化して、どこからでも色を取得し、それ自体を描画する前にそれに応じて変更するようにしましたか? 次のように drawRect を上書きします。

- (void) drawRect:... {

  if (somehowFetchTheUserDefaultsBoolValueHere) {
    self.tint = [UIColor redColor];  // details here may vary depedning on the actual superclass
  } else {
    self.tint = [UIColor greenColor];
  }

  [super drawRect:...];
}

(原理を示すだけです。実際には、それをコーディングするよりスマートな方法があります。)

あなたがそれをした場合setNeedsDisplay、現在のView Controllerでself.view行うでしょう。(疑わしい場合はメインスレッドで)

代替手段: 他の方法で着色を行う場合は、現在表示されているすべてのビューを着色するコードを実行する必要があります。それはほとんどの場合、一番上にあるView Controllerです。他のすべてのビュー コントローラーでは、メソッドに着色コードを配置できますviewWillAppear。正常に動作します。最近、自分でそれをしました。

ただし、アプリの合計サイズによっては、すべてのビューをサブクラス化する方が、1 回限りの作業で済むため、より効率的です。さらに、他のアプリで再利用できます。

于 2013-06-14T18:01:24.823 に答える