我有一堆UILabel需要全部设置相同但具有不同的帧。由于其中有很多我认为我会通过创建函数来降低代码量:
-(void)addField:(UILabel *)label withFrame:(CGRect)frame toView:(id)view {
label = [[UILabel alloc] initWithFrame:frame];
label.layer.cornerRadius = 3;
[view addSubview:label];
}
并通过以下方式调用:
[self addField:fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView];
这可以说明字段正确显示但是查看它fieldOneLabel没有初始化所以它只是不再引用那里的UILabel。我以为我可能不得不使用&但我想我的理解是不正确的,因为它会导致编译错误。我该怎么办?
答案 0 :(得分:3)
您可能想要返回标签,然后将其添加到UIView中,如下所示:
-(UILabel*)createLabelWithText:(NSString*)text andFrame:(CGRect)frame {
UILabel *label = [[UILabel alloc] initWithFrame:frame];
[label setText:text];
label.layer.cornerRadius = 3;
return label;
}
然后在您的代码中,您可以执行以下操作:
UILabel *xLabel = [self createLabelWithText:@"Some Text" andFrame:CGRectMake(20, 180, 61, 53)];
[theView addSubview:xLabel];
或者您希望以后作为属性访问它:
self.xLabel = [self createLabelWithText:@"Some Text" andFrame:CGRectMake(20, 180, 61, 53)];
[theView addSubview:xLabel];
答案 1 :(得分:1)
-(void)addField:(UILabel * __autoreleasing *)fieldOneLabel withFrame:(CGRect)frame toView:(id)view {
if (fieldOneLabel != nil) {
*fieldOneLabel = [[UILabel alloc] initWithFrame:frame];
(*fieldOneLabel).layer.cornerRadius = 3;
[view addSubview:(*fieldOneLabel)];
}
}
并通过以下方式调用:
[self addField:&fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView];
使用__autoreleasing可以避免电弧存储器问题
答案 2 :(得分:0)
我将其更改为不将UILabel发送到该函数,但返回创建的标签:
-(UILabel *)addFieldWithFrame:(CGRect)frame toView:(id)view {
UILabel *label = [[UILabel alloc] initWithFrame:frame];
label.layer.cornerRadius = 3;
[view addSubview:label];
return label;
}
并通过以下方式致电:
fieldOneLabel = [self addFieldWithFrame:CGRectMake(self.view.bounds.size.width / 2 - 128, 13, 61, 53) toView:view];
虽然类似于Scotts的回答,但我想避免在另一条线上添加视图。