2009-08-01 3 views
6

Ich werde ein 10x10 Raster von UIButton Objekten haben. Für jeden dieser UIButtons muss die Zeilen- und Spaltennummer referenziert werden, daher sollten sie wahrscheinlich in einem Array-Typ gespeichert werden.Die beste Methode 10x10 Grid von UIButtons zu erstellen?

Meine Frage: Was ist der einfachste Weg, um dieses Gitter zu erstellen? Programmatisch oder über den Interface Builder? Wenn programmgesteuert, was wäre der einfachste Weg, auf diese Schaltflächen zuzugreifen, so dass, wenn sie berührt werden, ich in der Lage bin, die Zeilen- und Spaltennummer der berührten Schaltfläche zu kennen?

Antwort

13

Ich persönlich mag IB nicht, so empfehle ich es programmatisch zu tun!

Verwenden Sie ein NSArray speichern Sie Ihre UIButton ist. Der Index jeder Schaltfläche lautet row*COLUMNS+column.

die Tag-Eigenschaft auf BASE Set + Index (BASE ein willkürlicher Wert> 0 ist), so dass Sie auf eine Schaltfläche Position finden können: 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

Dies war genau die Art von Antwort, die ich suchte. Ich wusste nicht, dass die "Tag" -Eigenschaft überhaupt existierte ... das ist eine große Hilfe. Vielen Dank, ich schätze die gründliche Antwort! –

+0

'willkommen. "tag" ist ziemlich nützlich, ja. Die UIView-Nachricht "viewWithTag:" kann verwendet werden, um eine Unteransicht nach Tag zu finden, z. button = [view viewWithTag: index] (aber es wäre langsamer als ein NSArray-Zugriff). Standardmäßig ist tag == 0, deshalb habe ich die BASE-Nummer hinzugefügt, falls es Geschwisterbuttons oder Ansichten gibt. – squelart

+0

Ja, Tags sind sehr praktisch. Sie können sie als direkte Bezeichner verwenden. Sie können sie für Dictionary-Lookups verwenden (nach der Konvertierung in NSNumber). Sie können sie verwenden, um eine Ansicht nach dem Zufallsprinzip auszuwählen - etwa wie viewWithTag: (arc4random()% 8) – Amagrammer

8

Sie ein Gridview aus dem moriarty library mit helfen können Layout - Positionierung jeder Taste, wo Sie es wollen. Teilweise auf Quarkarts Beispielcode als createButtonAtRow: col: -Methode aufbauend könnte dies wie folgt funktionieren:

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. 
Verwandte Themen