Dinámicamente nombra tags en el objective c

Soy nuevo en el desarrollo de iOS, solo tengo una pregunta rápida. Estoy creando una aplicación con 100 UILabel's. Cada label está numerada de 0 a 99. El problema es que no quiero hacer esto para todas las 100 tags.

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

En cambio, me gustaría hacer esto un poco más dinámicamente. A continuación bash usar loops para crear dinámicamente una cadena. Por ejemplo, al agregar "1.text" al final de "output" obtengo la cadena "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" to "output100" se declaran correctamente en la sección de interfaz y se sintetizan correctamente. ¿Hay algo que me falta aquí o simplemente no es posible? Cualquier ayuda sería apreciada.

cuando crea la label … establezca las tags de let say (100 — 200)

asi que . inicializa tu label de esta manera …

  for (int i=0; i< 100; i++) { UILabel *label = [[UILabel alloc] init] ; // label formatting code here... label.tag = i+100; } 

luego obtenga su label de esta manera … y configure su text

 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"]; } 

esto debería funcionar muy bien … ¿Cuál es el problema?

Al proporcionarle una matriz ( NSArray ) con todas sus tags, esta es una solución:

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

Editar: asignación, almacenamiento y acceso a 100 objects

Creo que es mejor tener todos los pointers de tags en una matriz en lugar de labelrlos, ¡especialmente porque tienes cien! y cada vez que llama viewWithTag: método viewWithTag: busca en la vista, no está indexado.

Usando 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 

Usando arrays C, que es un poco más corto ( labels[i] lugar de [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]; } 

La forma de get variables con nombres "variables" son las matrices.

Puedes hacer uno de dos:

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

Esto declarará una matriz de 100 tags, de 0 a 99, y puede acceder a ellas de esta forma:

 [output[50] setText:text]; 

La otra forma es:

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

Y acceda a ellos de esta manera:

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

En general, debe leer acerca de C arrays, y luego leer la documentation sobre NSArray y NSMutableArray.

En iOS, puedes gestionar vistas etiquetándolas. Entonces, para su propósito, puede crear una vista de base, en esto agregará todas las tags con tags apropiadas. Más adelante, siempre que necesite una label particular, solo vea la consulta con el método viewWithTag .

Aquí es cómo puedes implementarlo:

Creación de tags:

 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; } 

Acceso a las tags:

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

Para get más información sobre el labeldo de UIView, puede consultar la documentation .

Cuando dices: 'Cada label está numerada de 0 a 99', ¿quieres decir que tienen esas tags? Si es así, inicie sus tags de 1 a 100, no de 0 a 99. Si no, configure tags para cada label. (Si no sabe qué tags son, lea sobre la propiedad 'label' en la documentation de UIView )

Entonces, puedes acceder fácilmente a estas tags en un ciclo:

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

Si aún no ha creado todas las tags en una vista, sugeriría crear las tags mediante progtwigción, en un ciclo y establecer las tags. Como puede acceder fácilmente a ellos utilizando las tags, tampoco debe declararlas como properties.

Puede que llegue un poco tarde al show aquí. No estoy muy seguro de si quieres nombrar los uilabels o establecer la propiedad de text de los uilabels? desde su código de ejemplo, parece que está tratando de establecer el text, dado que ha dicho que ya los sintetizó. si ese es el caso, puedo nombrar esa melodía con una línea, ¡bob! kvc (encoding de valores key) creo que si es la mejor opción …

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

el resultado final sería como hacer esto …

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

si quisieras configurar las tags, podrías hacer lo mismo con …

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

ese resultado final sería como hacer esto …

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

por supuesto, podrías poner ambas rutinas en el mismo bucle si así lo deseas. Si esto es lo que buscas, te recomendaría cambiar tu código a esto. Es, de lejos, la manera más eficiente y "como la manzana" de hacerlo. podrías cambiar las cosas y modificarlas como quieras para hacer los cambios dynamics que quieras. Es un método genial. Cortó casi 500 líneas de código en uno de mis proyectos una vez que descubrí esto. Es sorprendente lo que aprendes cuando realmente lees los documentos.