在目标c中动态命名标签

时间:2012-03-07 06:54:10

标签: ios iphone objective-c xcode

我是iOS开发的新手,只是有一个简单的问题。我正在用100 UILabel创建一个应用程序。每个标签编号为0到99.问题是我不想对所有100个标签执行此操作。

output1.text = [[NSString alloc] initWithFormat:@"1"];
output2.text = [[NSString alloc] initWithFormat:@"2"];
.....
output100.text = [[NSString alloc] initWithFormat:@"100"];

相反,我想更动态地做这件事。下面我试图使用循环动态创建一个字符串。例如,通过将“1.text”附加到“output”的末尾,我得到字符串“output1.text”。

for (int i=0; i< 100; i++) {
    outputNameString = [NSMutableString stringWithCapacity:0];
    [outputNameString setString:@"output"];
    [outputNameString appendString:[NSString stringWithFormat:@"%i.text",i + 1]];
    outputNameString = [[NSString alloc] initWithFormat:@"%@",i];
}

“output1”到“output100”在接口部分正确声明并正确合成。我在这里缺少什么,或者这根本不可能?任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:9)

创建标签时..设置标签,例如(100 --- 200)

所以。 像这样初始化你的标签..

 for (int i=0; i< 100; i++) {

UILabel *label = [[UILabel alloc] init] ;
// label formatting code here...

label.tag = i+100;
   }

然后得到你的标签......并设置其文本

for (int i=0; i< 100; i++) {

UILabel *myLabel = (UILabel *)[self.view viewWithTag:i+100]; // get the label with tag
myLabel.text = [NSString stringWithFormat:@" Label %d",i+1"];
}

这应该很棒.. 有什么问题。?

答案 1 :(得分:2)

如果你有一个包含所有标签的数组(NSArray),这是一个解决方案:

for (int i=0; i< 100; i++) {
    UILabel *label = [arrayOfLabels objectAtIndex:i];
    label.text = [NSString stringWithFormat:@"output.%d.text", i+1];
}


编辑:分配,存储和访问100个对象

我认为最好将所有标签指针放在数组中而不是标记它们,特别是因为你有一百个!每次调用viewWithTag:方法时,它都会搜索视图,而不是索引。

使用NSArray:

@interface Object : SuperObject {
    NSArray *labels;
}
@end
@implementation
- (void)someMethodThatCreatesLabels {
    labels = [[NSMutableArray alloc] initWithCapacity:100];
    for(NSInteger i = 0; i < 100; i++){
        UILabel *label = [[UILabel alloc] ...];
        label.text = [NSString stringWithFormat:@"output.%d.text", i+1];
        [view addSubview:label]
        [labels addObject:label];
        [label release];
    }
}
- (void)methodThatAccessALabel{
    UILabel *label45 = [labels objectAtIndex:45];
    // Do your thing ...
}
- (void)dealloc{
    [labels release];
    [super dealloc];
}
@end

使用更短的C数组(labels[i]代替[labels objectAtIndex:i]

@interface Object : SuperObject {
    UILabel **labels;
}
@end
@implementation Object
- (void)methodThatCreatesLabels
{
    labels = malloc(100*sizeOf(UILabel *));
    for(NSInteger i = 0; i < 100; i++){
        labels[i] = [[UILabel alloc] ...];
        labels[i].text = [NSString stringWithFormat:@"output.%d.text", i+1];
        [view addSubview:labels[i]]
    }
}
- (void)methodThatAccessALabel{
    UILabel *label45 = labels[45];
    // Do your thing ...
}
- (void)dealloc{
    for(int i = 0; i<100; i++) [labels[i] release];
    free(labels);
    [super dealloc];
}

答案 2 :(得分:1)

使用“变量”名称获取变量的方法是数组。

您可以选择以下两种方法之一:

UILabel *output[100];
for(NSInteger i = 0; i < 100; i++){
  output[i] = [[UILabel alloc] ...];
}

这将声明一个包含100个标签的数组,从0到99,您可以像这样访问它们:

[output[50] setText:text];

另一种方式是:

NSMutableArray *outputLabels = [[NSMutableArray alloc] initWithCapacity:100];
for(NSInteger i = 0; i < 100; i++){
  UILabel *label = [[UILabel alloc] ...];
  [outputLabels addObject:label];
}

然后像这样访问它们:

[[outputLabels objectAtIndex:50] setText:text];

通常,您应该阅读有关C数组的内容,然后阅读有关NSArray和NSMutableArray的文档。

答案 3 :(得分:0)

在iOS中,您可以通过标记视图来管理视图。因此,为了您的目的,您可以创建一个基本视图,在此基础上,您将添加带有适当标签的所有标签。稍后,只要您需要特定标签,只需使用方法viewWithTag查询视图。

以下是如何实施它:

创建标签:

UIView *baseView = [[UIView alloc] init];
//keep its reference for later use.. you will need to make it instance variable if you want to access labels in other than this method.

for(int i=0;i<100;i++)
{
   UILabel *label = [[UILabel alloc] init];
   label.tag = i+1; //we are offsetting its value by 1 because tag=0 is for the baseview itself.
   label.text = <the text you wish to assign>;
   [baseView addSubview:label];
   [label release]; //if you are not using ARC.
   label = nil;
}

访问标签:

UILabel *label = (UILabel *)[baseView viewWithTag:<provide the tag value you wish to access>];

有关UIView标记的更多信息,请参阅documentation

答案 4 :(得分:0)

当你说'每个标签编号为0到99'时,你的意思是他们有那些标签吗? 如果是,请从1到100而不是0到99开始标记。 如果不是,请为每个标签设置标签。 (如果你不知道标签是什么,请阅读UIView documentation)中的'tag'属性

然后,您可以在循环中轻松访问这些标签:

for(int i = 1; i <= 100; i++)
{
    [[self.view viewWithTag:i] setText:[NSString stringWithFormat:@"Output%d.text",i]];
}

如果您尚未在视图中创建所有标签,我建议您以编程方式在循环中创建标签并设置标签。由于您可以使用标签轻松访问它们,因此您无需将它们声明为属性。

答案 5 :(得分:0)

我在这里的节目可能有点晚了。我不太确定你是否想要给uilabels命名或设置uilabels的文本属性?从你的示例代码看起来你正在尝试设置文本,因为你已经说过你已经合成了它们。如果是这样的话,我可以用一行来命名那首曲子,鲍勃! kvc(键值编码)我认为如果你最好的选择......

for (int i=1; i< 101; i++)
{
    [self setValue:[NSString stringWithFormat:@"%i", i] forKeyPath:[NSString stringWithFormat:@"output%i.text", i]];
} 

最终结果就像这样......

output1.text = @"1";
// repeat...
output100.text = @"100";

如果您想设置标签,您可以使用...

for (int i=1; i< 101; i++)
    {
        [self setValue:i forKeyPath:[NSString stringWithFormat:@"output%i.tag", i]];
    } 

最终结果就像这样......

output1.tag = 1;
// repeat...
output100.tag = 100;

当然,如果你愿意的话,你可以将两个例程放在同一个for循环中。如果这是你所追求的,我建议你改变你的代码。到目前为止,这是最有效和“类似苹果”的做法。你可以改变一切并调整它,以便你想要做出你想要的动态变化。这是一个非常酷的方法。一旦我弄清楚这一点,我在我的一个项目中减少了近500行代码。当你真正阅读文档时,你学到了什么。