我有两件事似乎应该很容易,我认为它们很容易,但这是我的第一个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";
}
}
让我走向正确方向的任何帮助都会很棒!
答案 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]];
}