4

UIView の初期化子をカスタマイズして値を初期化子に渡すことができるようにする最良の方法を決定しようとしています。この値はdrawRect.

現在、私はデフォルトを使用しており、この UIView を作成するクラスは、呼び出し後にinitWithFrameiVar を値に設定しますが、実際には機能しています。UIView が初期化された後に設定されていても、何らかの形でこの iVar の値を取得しています。initWithFramedrawRect

したがって、次の2つのいずれかが必要です。

drawRect1) これで問題ないという自信: UIView が初期化された後に iVar が別のオブジェクトによって設定されるように、描画を少し遅らせることに頼ることができます。その場合、UIView の初期化がdrawRect呼び出されるのはいつですか?

または、

(CGRect)frame2)初期化中に値を渡す必要があります。これは、引数として以上を取るカスタム初期化子を作成するための最良の方法ですか?initWithFrame.これを行うのと同じくらい簡単でしょうか:

 myNewView=[[MyCustomView alloc] initWithFrame:myRect andMore:myValue];

そして、MyCustomView.m で:

 - (id)initWithFrame:(CGRect)frame andMore:(int)someValue
  {
     self = [super initWithFrame:frame];
     if (self) {
       myIvar=someValue;
       ... //continue as normal
     }
  }

このコードは良いアプローチでしょうか? drawRectそうすれば、呼び出される前に値がそこにあることを安心して知ることができます。

4

4 に答える 4

4

drawRect:1.)任意の の後に呼び出されることに依存できますinit。実際、drawRect:ビューの描画と合成が完了したときに呼び出されます。これは通常、Core Animation コミットの結果として発生します (CALayer または UIView (常に CALayer によってサポートされている) を変更した場合、ランループの最後に実行されます)。 )。

2.) このアプローチは、アーキテクチャの観点から優れています。この変数がクラスの機能に不可欠な部分であると考える場合 (そしてクラスはそれなしでは正しく機能しません)、それは間違いなく init パラメーターである必要があります。また、他の init-Methods 内で NSInternalInconsistencyException (またはその他の例外) をスローすること、および/または非推奨としてマークすることを検討することもできます (スーパークラスの init-Methods は、 で呼び出された場合でも正常に動作しますsuper initWithFrame:)。

于 2012-04-11T08:41:03.627 に答える
2

2 番目の方法は、指定した指定イニシャライザを使用してプログラムで明示的にビューを作成する場合に理想的です。警告:ビューが NIB を介して構築されている場合、これは当てはまりません。

于 2012-04-11T07:41:32.810 に答える
1

簡単な答え: どちらのアプローチもうまくいくはずです。

より長い答え:

  1. このdrawRect:メソッドは実行ループで呼び出されるため、初期化がすべて終了してから制御を放棄して実行ループに戻るまで呼び出されません。確かに、ビューを初期化してすぐにプロパティを設定しても問題はありません。

  2. 2 番目のアプローチは、ほとんどそのまま機能するはずです。

私は2番目のアプローチを使用します。

于 2012-04-11T07:37:44.407 に答える