在子视图中使用数据源中的数据到initWithFrame

时间:2012-08-08 16:06:41

标签: objective-c initialization datasource

我正在创建子视图类,从其数据源获取有关其框架的信息。我想创建一个自定义初始化方法,该方法将实现数据源协议的对象作为参数。其中一个数据源协议方法frameSize使数据源返回CGrect。我的问题是,在调用[super initWithFrame]之前是否可以在自定义初始化中设置数据源?这就是我所拥有的:

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

在调用初始化方法之前设置属性对我来说似乎违反直觉。有没有一种好方法可以做到这一点,或者用空帧初始化它然后再设置框架是否可行?提前致谢

2 个答案:

答案 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;
}