查看以下代码:
@property (weak, nonatomic) UILabel *l112;
@property (weak, nonatomic) UILabel *l212:
@property (weak, nonatomic) UILabel *l312:
((RBScorecardVC *)self.presentingViewController).l112.text = @"Hello"
((RBScorecardVC *)self.presentingViewController).l212.text = @"Hello"
((RBScorecardVC *)self.presentingViewController).l312.text = @"Hello"
注意我如何将标签的所有文本设置为“Hello”。必须有一种更有效的方法来做到这一点。我希望我能以某种方式访问UIlabels(l112,1212等)的名称来这样做。这有意义吗?在我的实际应用程序中,我并没有真正将所有内容设置为“Hello”,而是文本是计算的结果。此外,在我的实际应用程序中,我有超过3个标签要设置(有50+)这是我的实际代码使用重复的if语句来访问每个UILabel:
-(IBAction) submitScore: (id)sender
{
self.stringID = ((RBScorecardVC *)self.presentingViewController).self.giveString;
if (self.stringID isEqualToString:@"l112")
{ ((RBScorecardVC *)self.presentingViewController).l112.text = [[NSString alloc]initWithFormat:@"%d", self.accumulator];} //l112 is the name of my UILabel
else if (self.stringID is EqualToString:@"l212")
{ ((RBScorecardVC *)self.presentingViewController).l212.text = [[NSString alloc]initWithFormat:@"%d", self.accumulator];} //l212 is the name of my UILabel
}
我希望能够像这样更有效地做到这一点:
-(IBAction) submitScore: (id)sender
self.stringID = ((RBScorecardVC *)self.presentingViewController).self.giveString;
((RBScorecardVC *)self.presentingViewController).[UILabel withTitle:@"%@",stringID].text = [[NSString alloc]initWithFormat:@"%d", self.accumulator];}
注意我的[UILabel withTitle:@“%@”,stringID]部分用于点表示法。我知道这不起作用,但我想知道我怎么能正确写这个,所以stringID可以用来访问我需要的UILabel的名字?
答案 0 :(得分:5)
尝试在UILabel上使用valueForKey:
。
但是,更简洁的解决方案可能是将这些属性简单地存储在NSDictionary中。
答案 1 :(得分:0)
为什么要使用点符号 - 最初用于对象@properties - 用于其他内容?
请参阅Dot Notation vs Method Notation
您似乎对Objective-C语法感到困惑:为什么[UILabel withTitle:"%@", stringId]
而不是更简单[UILabel withTitle:stringID]
,或者如果stringId不是字符串,[UILabel withTitle:[NSString stringWithFormat:@"%@", stringID]]
另外,withTitle
为什么UILabel
上的类方法而不是presentingViewController
的实例方法?
答案 2 :(得分:0)
这样的事情可能就是你所要求的,但我同意使用NSDictionary的答案可能更容易维护。或者,您可以在IB中的标签上使用整数标记属性,并调用父视图的viewWithTag:方法。
- (UILabel *)labelWithName:(NSString *)name
{
SEL selector = NSSelectorFromString(name);
if (![self respondsToSelector:selector])
return nil;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
id result = [self performSelector:selector];
#pragma clang diagnostic pop
if (!result)
return nil;
if (![result isKindOfClass:[UILabel class]])
return nil;
return (UILabel *)result;
}
- (IBAction)derp:(id)sender
{
UILabel *label = [self labelWithName:@"label1"];
[label setText:@"I'm label 1"];
label = [self labelWithName:@"label2"];
[label setText:@"I'm label 2"];
}
答案 3 :(得分:0)
此处的其他答案涉及对象的属性。在这种情况下,您尝试访问对象本身。当您开始问自己这样的问题时,您应该将所有对象(在本例中为标签)存储在数组属性中,而不是每个标签的单独属性。不要将标签/引用标签作为命名变量(如l112
),而应将它们视为数组中的索引:
UILabel * theLabelINeed = [self.myArray objectAtIndex:2]; [theLabelINeed callWhateverMethodINeedTo];
或更短,如果你来自python / ruby背景,这对你来说更具可读性:
[self.myArray [2] callWhateverMethodINeedTo];
如果您需要快速访问数组中的每个标签,可以在for循环中使用快速枚举:
for (UILabel *currLabel in self.myArray) {
[currLabel callWhateverMethodINeedTo];
}
您也可以使用NSDictionary
,这样可以为对象分配“键”或名称。
NSDictionary *dict {"l112": label1, "l113": label2}; // or some other dictionary creation method, maybe a mutable dictionary or whatever.
UILabel *myLabel = [dict objectForKey:@"l112"];