我是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”在接口部分正确声明并正确合成。我在这里缺少什么,或者这根本不可能?任何帮助将不胜感激。
答案 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];
}
我认为最好将所有标签指针放在数组中而不是标记它们,特别是因为你有一百个!每次调用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行代码。当你真正阅读文档时,你学到了什么。