Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在子视图中将数据源中的数据用于initWithFrame_Objective C_Initialization_Datasource - Fatal编程技术网

Objective c 在子视图中将数据源中的数据用于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

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

-(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;
回归自我;
}