0

我正在创建从其数据源获取有关其框架的信息的子视图类。我想创建一个自定义初始化方法,该方法将实现数据源协议的对象作为参数。数据源协议方法之一,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

一个 init 方法必须总是赋值self = [super initXXX],因为 super init 方法可能返回一个与原来不同的值self

但是您可以先调用initWithFrame:一个虚拟矩形并在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 回答