我正在创建子视图类,从其数据源获取有关其框架的信息。我想创建一个自定义初始化方法,该方法将实现数据源协议的对象作为参数。其中一个数据源协议方法frameSize使数据源返回CGrect。我的问题是,在调用[super initWithFrame]之前是否可以在自定义初始化中设置数据源?这就是我所拥有的:
-(id) initWithDataSource:(id)dataSource
{
self._dataSource=dataSource;
[super initWithFrame:[self._dataSource frameSize];
return self;
}
在调用初始化方法之前设置属性对我来说似乎违反直觉。有没有一种好方法可以做到这一点,或者用空帧初始化它然后再设置框架是否可行?提前致谢
答案 0 :(得分:1)
我建议采用不同的方式,而不是使用临时矩形,然后移动东西。请记住,在将数据源实际指定为属性之前,没有什么能阻止您使用数据源(尽管添加协议声明以使编译器满意)。
以下是我如何做到这一点:
-(id) initWithDataSource: (id<MyDataSourceProtocol>) ds {
self = [super initWithFrame: [ds frameSize]];
self.dataSource = ds;
return self;
}
答案 1 :(得分:0)
init方法必须始终指定self = [super initXXX]
,因为超级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;
}