Ios 对象c中的动态名称标签
我是iOS开发新手,只是有个简单的问题。我正在创建一个有100个UILabel的应用程序。每个标签编号为0到99。问题是我不想对所有100个标签都这样做Ios 对象c中的动态名称标签,ios,iphone,objective-c,xcode,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"]
output1.text = [[NSString alloc] initWithFormat:@"1"];
output2.text = [[NSString alloc] initWithFormat:@"2"];
.....
output100.text = [[NSString alloc] initWithFormat:@"100"];
相反,我想更动态地做这件事。下面我尝试使用循环来动态创建字符串。例如,通过在“output”的末尾添加“1.text”,我得到了字符串“output1.text”
for(int i=0;i<100;i++){
outputNameString=[NSMutableString stringWithCapacity:0];
[outputNameString设置字符串:@“output”];
[outputNameString appendString:[NSString stringWithFormat:@“%i.text”,i+1];
outputNameString=[[NSString alloc]initWithFormat:@“%@”,i];
}
“output1”到“output100”在接口部分正确声明并正确合成。这里有没有我遗漏的东西,或者这根本不可能?如果您创建标签,将不胜感激。将不胜感激。。从lets say(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*label=[[UILabel alloc]init];
//标签格式化代码在这里。。。
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"];
}
for(int i=0;i<100;i++){
UILabel*myLabel=(UILabel*)[self.view viewWithTag:i+100];//获取带有标记的标签
myLabel.text=[NSString stringWithFormat:@“标签%d”,i+1”];
}
这应该很有效。。
问题是什么?获取具有“变量”名称的变量的方法是数组 您可以执行以下两种操作之一:
UILabel *output[100];
for(NSInteger i = 0; i < 100; i++){
output[i] = [[UILabel alloc] ...];
}
另一种方式是:
NSMutableArray *outputLabels = [[NSMutableArray alloc] initWithCapacity:100];
for(NSInteger i = 0; i < 100; i++){
UILabel *label = [[UILabel alloc] ...];
[outputLabels addObject:label];
}
通常,您应该阅读有关C阵列的信息,然后阅读有关NSArray和NSMutableArray的文档。如果您有一个带有所有标签的阵列(
NSArray
),这是一个解决方案:
for (int i=0; i< 100; i++) {
UILabel *label = [arrayOfLabels objectAtIndex:i];
label.text = [NSString stringWithFormat:@"output.%d.text", i+1];
}
使用C数组,它稍微短一点(labels[i]
而不是[labels objectAtIndex:i]
)
@接口对象:超级对象{
UILabel**标签;
}
@结束
@实现对象
-(void)创建slabel的方法
{
标签=malloc(100*sizeOf(UILabel*);
对于(NSInteger i=0;i<100;i++){
标签[i]=[[UILabel alloc]…];
标签[i].text=[NSString stringWithFormat:@“输出。%d.text”,i+1];
[视图添加子视图:标签[i]]
}
}
-(无效)可访问的方法{
UILabel*label45=标签[45];
//做你的事。。。
}
-(无效)解除锁定{
对于(int i=0;i在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*baseView=[[UIView alloc]init];
//保留其引用以供以后使用。如果要访问此方法以外的标签,则需要将其设为实例变量。
对于(inti=0;i当你说“每个标签编号为0到99”时,你的意思是他们有这些标签对吗?
如果是,则从1到100开始标记,而不是从0到99。
如果否,则为每个标签设置标记。(如果不知道标记是什么,请阅读中的“标记”属性)
然后,您可以在循环中轻松访问这些标签:
for(int i = 1; i <= 100; i++)
{
[[self.view viewWithTag:i] setText:[NSString stringWithFormat:@"Output%d.text",i]];
}
用于(int i=1;i我可能会在这里的节目中迟到一点。我不太确定您是否要命名uilabels或设置uilabels的text属性?从您的示例代码来看,您似乎正在尝试设置文本,因为您已经说过您已经合成了它们。如果是这样,我可以用一行来命名该曲调,bob!kvc(键值编码)我想如果你最好的选择
for (int i=1; i< 101; i++)
{
[self setValue:[NSString stringWithFormat:@"%i", i] forKeyPath:[NSString stringWithFormat:@"output%i.text", i]];
}
如果你想设置标签,你可以用
for (int i=1; i< 101; i++)
{
[self setValue:i forKeyPath:[NSString stringWithFormat:@"output%i.tag", i]];
}
当然,如果你愿意的话,你可以把两个例程放在同一个for循环中。如果这是你想要的,我建议你把代码改成这个。这是迄今为止最有效的和“苹果式”的"这样做的方式。你可以随时改变周围的事物,并根据你想要的动态变化对其进行调整。这是一个非常酷的方法。一旦我弄明白了这一点,它在我的一个项目中减少了近500行代码。当你真正阅读文档时,你所学到的东西令人惊讶。可能是重复的,或者实际上不是这样一个好主意,标记视图很容易,但查找可能会有点昂贵。[view viewWithTag:n]
将查看视图
的所有子视图,包括视图
,并比较标签号。这意味着在最坏的情况下,您将进行100+99+98+…1比较。如果您想变得精明,请按照@EmilioPelaez建议的方式创建/访问它们。
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>];
for(int i = 1; i <= 100; i++)
{
[[self.view viewWithTag:i] setText:[NSString stringWithFormat:@"Output%d.text",i]];
}
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;