0

查看以下代码:

@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 的名称?

4

4 回答 4

5

尝试valueForKey:在您的 UILabel 上使用。

但是,更简洁的解决方案可能是将这些属性简单地存储在 NSDictionary 中。

于 2013-02-07T23:01:59.620 回答
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];
}

您也可以使用 an NSDictionaryinstead,它可以让您将“键”或名称分配给对象。

NSDictionary *dict {"l112": label1, "l113": label2}; // or some other dictionary creation method, maybe a mutable dictionary or whatever.
UILabel *myLabel = [dict objectForKey:@"l112"];
于 2013-02-07T23:26:18.763 回答
0

为什么要使用点表示法——最初是为对象@properties 设计的——用于其他东西?

请参阅点表示法与方法表示法

您似乎对 Objective-C 语法感到困惑:为什么[UILabel withTitle:"%@", stringId]不是更简单[UILabel withTitle:stringID],或者如果 stringId 不是字符串,[UILabel withTitle:[NSString stringWithFormat:@"%@", stringID]]

另外,为什么是withTitle类方法UILabel而不是您的实例方法presentingViewController

于 2013-02-07T23:06:17.603 回答
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"];
}
于 2013-02-07T23:20:18.793 回答