0

データソースからフレームに関する情報を取得するサブビュークラスを作成しています。データソースプロトコルを引数として実装するオブジェクトを受け取るカスタム初期化メソッドを作成したいと思います。データソースプロトコルメソッドの1つであるframeSizeは、データソースにCGrectを返します。私の質問は、[super initWithFrame]を呼び出す前に、カスタム初期化でデータソースを設定できるかどうかです。これは私が持っているものです:

-(id) initWithDataSource:(id)dataSource
{
self._dataSource=dataSource;
[super initWithFrame:[self._dataSource frameSize];
return self;
}

初期化メソッドを呼び出す前にプロパティを設定することは、私には直感に反しているようです。これを行う良い方法はありますか、それとも空のフレームで初期化してから後でフレームを設定することは可能ですか?前もって感謝します

4

2 に答える 2

1

一時的な長方形を使用するのではなく、別の方法で移動してから移動することをお勧めします。データソースが実際にプロパティとして割り当てられる前に、データソースの使用を妨げるものは何もないことを忘れないでください(ただし、コンパイラを満足させるためにプロトコル宣言を追加してください)。

これが私がこれを行う方法です:

-(id) initWithDataSource: (id<MyDataSourceProtocol>) ds {
    self = [super initWithFrame: [ds frameSize]];
    self.dataSource = ds;
    return self;
}
于 2012-08-08T20:08:08.720 に答える
0

self = [super initXXX]スーパーinitメソッドは元の。とは異なる値を返す可能性があるため、initメソッドは常にを割り当てる必要がありますself

initWithFrame:ただし、最初にダミーのrectを使用して呼び出し、self初期化後に実際のフレームを割り当てることができます。

-(id) initWithDataSource:(id)dataSource
{
    self = [super initWithFrame:CGRectMake(0, 0, 1, 1)];
    if (self) {
        self._dataSource = dataSource;
        self.frame = [self._dataSource frameSize];
    }
    return self;
}
于 2012-08-08T16:45:45.663 に答える