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