1

我有一堆 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 。我想我可能不得不使用 & 但我想我的理解是不正确的,因为它会导致编译器错误。我应该做什么?

4

3 回答 3

2

您可能希望返回标签,然后将其添加到 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];
于 2013-09-25T04:19:46.100 回答
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 可以避免弧内存问题

于 2013-09-25T06:20:37.533 回答
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 的回答,但我想避免在另一行添加视图。

于 2013-09-30T04:26:34.290 回答