我正在尝试编写一个初始化我的自定义UIView属性的快捷方式,而不是逐行写出每个属性,但不幸的是它没有按照我的预期工作。
// .h file
@property (nonatomic, strong) UIView *view1;
@property (nonatomic, strong) UIView *view2;
@property (nonatomic, strong) UIView *view3;
@property (nonatomic, strong) UIView *view4;
// .m file
UIView *views[] = { self.view1, self.view2, self.view3, self.view4 };
for ( int i = 0; i < sizeof(views) / sizeof(views[0]); i++ ) {
views[i] = [[UIView alloc] initWithFrame:self.frame];
}
NSLog( @"%@", self.view1 ); // prints null
这是不允许使用C风格的数组?
答案 0 :(得分:1)
views[]
的初始化看起来不错,但只要你做
views[i] = ...
你只是覆盖了数组的内容。但是,您不正在初始化self.view1
,self.view2
等。尝试
NSLog(@"%@", views[0]);
看看我的意思。
我不会像下面这样做,但你可能可能做(未经测试):
UIView **views[] = { &self.view1, &self.view2, &self.view3, &self.view4 };
for (int i = 0; i < (sizeof(views) / sizeof(views[0]); ++i)
{
*views[i] = [[UIView alloc] initWithFrame: self.frame];
}
NSLog(@"%@", self.view1);
我宁愿一个接一个地初始化它们,没有数组。我没有看到使用数组和循环的任何优势。
答案 1 :(得分:1)
您只是更改数组内的指针,self.view1指针仍将指向nil。
您可以将一组视图作为属性:
@property(nonatomic,strong) UIView **views;
或许您可以使用Key Value Coding之类的
for(int i=1;i<5;i++){
NSString* key = [NSString stringWithFormat:@"view%i",i];
UIView *view = //initialize view
[self setValue:view forKey:key];
}
答案 2 :(得分:0)
拨打电话,例如开始时self.view1
会在您初始化之前给您nil
。这一行
UIView *views[] = { self.view1, self.view2, self.view3, self.view4 };
有效地创建了一个包含4 nil
s。
之后将新的UIView
实例插入到数组中对属性没有影响。事实上,属性只是一对选择器(例如view1
和setView1:
),并且它本身不能可靠地与C风格的指针一起使用。
你可以使用带有UIView **
指针数组的支持ivars,但你最好重新考虑整个方法。