2009-08-01 7 views
6

Voy a tener una grilla de 10x10 de objetos UIButton. Cada uno de estos UIButtons va a tener que estar referenciado por el número de fila y columna, por lo que probablemente deberían almacenarse en algún tipo de matriz.¿La mejor manera de construir una cuadrícula de 10x10 de UIButtons?

Mi pregunta: ¿cuál es la forma más fácil de crear esta cuadrícula? ¿Programado o mediante el Interface Builder? Si programáticamente, ¿cuál sería la forma más fácil de acceder a estos botones para que cuando se tocan, puedo saber el número de fila y columna del botón tocado?

Respuesta

13

Personalmente, no me gusta IB, ¡así que recomiendo hacerlo programáticamente!

Use un NSArray para almacenar sus UIButton's. El índice de cada botón es row*COLUMNS+column.

establecer la propiedad etiqueta para BASE + índice (BASE siendo un valor arbitrario> 0) para que pueda encontrar la posición de un botón: index=tag-BASE; row=index/COLUMNS; column=index%COLUMNS;

- (void)loadView { 
    [super loadView]; 

    for (NSInteger row = 0; row < ROWS; row++) { 
     for (NSInteger col = 0; col < COLS; col++) { 
      UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
      [buttonArray addObject:button]; 
      button.tag = BASE + row * COLS + col; 
      button.frame = ...; 
      [button addTarget:self action:@selector(didPushButton:) forControlEvents:UIControlEventTouchDown]; 
      [self.view addSubview:button]; 
     } 
    } 
} 

- (void)didPushButton:(id)sender { 
    UIButton *button = (UIButton *)sender; 
    NSInteger index = button.tag - BASE; 
    NSInteger row = index/COLS; 
    NSInteger col = index % COLS; 
    // ... 
} 
+0

Este era exactamente el tipo de respuesta que estaba buscando. No sabía que la propiedad "tag" existía ... eso es una gran ayuda. Muchas gracias Squelart, agradezco la respuesta completa! –

+0

'bienvenida. "etiqueta" es bastante útil, sí. El mensaje de UIView "viewWithTag:" se puede usar para buscar una subvista por etiqueta, p. button = [view viewWithTag: index] (pero sería más lento que un acceso NSArray). Por etiqueta predeterminada == 0, es por eso que agregué el número BASE, en caso de que haya botones hermanos o vistas. – squelart

+0

Sí, las etiquetas son muy útiles. Puede usarlos como identificadores directos. Puede usarlos para búsquedas en diccionarios (después de convertir a NSNumber). Puede usarlos para seleccionar una vista aleatoriamente, algo así como viewWithTag: (arc4random()% 8) – Amagrammer

8

Puede utilizar un GridView de la moriarty library para ayudar con diseño - colocando cada botón donde lo desee. La construcción en parte de código de ejemplo de squelart como createButtonAtRow: Col: método, esto podría funcionar de la siguiente manera:

GridView* gridview = [[GridView alloc] initWithRows:ROWS cols:COLS]; 
for (NSInteger row = 0; row < ROWS; ++row) { 
    for (NSInteger col = 0; col < COLS; ++col) { 
    [gridView addsubView:[self createButtonAtRow:row col:col]]; 
    } 
} 
[myView addSubview:gridView]; 
[gridView release]; // Let myView retain gridView. 
Cuestiones relacionadas