Objective-C for循环设置变量文本值

时间:2012-12-27 14:04:28

标签: objective-c

我有两件事似乎应该很容易,我认为它们很容易,但这是我的第一个Objective-C程序,所以它不像我在我的本地Perl那样容易找到我。 这两个例子几乎相同,但我在想,因为一个人使用@synthesize它可能会有很大不同。

示例1

// What Works
@synthesize display0 = _display0;
@synthesize display1 = _display1;
@synthesize display2 = _display2;
@synthesize display3 = _display3;

// What I would like to do:
for (int i=0; i<4; i++)
{
    @synthesize display$i = _display$i;
}

示例2

// Works
- (IBAction)clearPressed
{
    self.display0.text = @"0";
    self.display1.text = @"0";
    self.display2.text = @"0";
    self.display3.text = @"0";
}

// What I would like to see
- (IBAction)clearPressed
{
    for (int i=0; i<4; i++) {
        self.display$i.text = @"0";
    }
}

让我走向正确方向的任何帮助都会很棒!

6 个答案:

答案 0 :(得分:13)

如果您正在使用UILabel,请尝试这样做:

@property (nonatomic, retain) IBOutletCollection(UILabel) NSArray *valueFields;


- (IBAction)clearPressed
{
    for(UILabel *label in valueFields)
    {
        label.text = @"0";
    }
}

答案 1 :(得分:9)

只需使用IBOutletCollection:

@property (strong) IBOutletCollection(UILabel) NSArray *labels;

然后你可以使用快速枚举循环它:

UILabel *label;
for (label in labels) {
    label.text = @"0";
}

答案 2 :(得分:4)

一种方法是使用-valueForKey,它检索传递给它的property-name的值。结合+stringWithFormat,我们可以这样做:

for (int i = 0; i < 4; i++) {
    NSString *key = [NSString stringWithFormat:@"display%i",i];
    UILabel *label = [self valueForKey:key];
    label.text = @"";
}

但你应该考虑使用数组。如果要在界面构建器中创建标签,请使用IBOutletCollection

//Connect to every label (.h)    
@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *displays;

//Use a fast enumeration to clear every label
for (UILabel *label in self.displays) {
    label.text = @"";
}
//Setting one labels text from an array
[(UILabel *) self.displays[numberOfLabel] setText:@"text"];

答案 3 :(得分:0)

为什么不使用数组?

@property (nonatomic, strong) NSMutableArray *display;

@synthesize display;

- (IBAction)clearPressed
{
    for (int i=0; i<4; i++) {
        [self.display setObject:@"0" atIndexedSubscript:i];
    }
}

答案 4 :(得分:0)

对于例1--如果您最新版本的Xcode不需要@synthesize,它将自动为您执行

示例2--我不相信你想做的事情就像在Objective-C中那样(H2CO3在他的answer中证明我错了),但如果你想要一个循环,那么我会创建UILabel或UITextFields的NSMutableArray,并使用以下方法简单地循环它们:

for(UILabel *lbl in lblArray)
{
    lbl.text = @"0";
}

或者你可以迭代你的UIViews子视图并按照这样做:

for(UIView *view in self.view.subviews)
{
    if([view isKindOfClass:[UILabel class]])
    {
        UILabel *lbl = (UILabel *)view;
        lbl.text = @"0";
    }
}

答案 5 :(得分:0)

使用键值观察

for (int i=0; i<4; i++) {
     [self setValue:@"0" forKeyPath:[[NSString alloc] initWithFormat:@"display%i", i]];
}