2009-08-01 3 views
6

У меня будет сетка 10x10 объектов UIButton. Каждой из этих UIButtons нужно будет ссылаться на номер строки и столбца, поэтому они, вероятно, должны быть сохранены в каком-либо типе массива.Лучший способ построить сетку 10x10 UIButtons?

Мой вопрос: Какой самый простой способ создать эту сетку? Программно или через построитель интерфейсов? Если программно, каким будет самый простой способ доступа к этим кнопкам, так что, когда они будут затронуты, Я могу узнать номер строки и столбца затронутой кнопки?

ответ

13

Мне лично не нравится IB, поэтому я рекомендую делать это программно!

Используйте NSArray для хранения ваших UIButton. Индекс каждой кнопки: row*COLUMNS+column.

Установите свойство тега в BASE + индекс (ОСНОВА быть произвольное значение> 0), так что вы можете найти положение кнопки щелкните кнопку: 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

Это был именно тот ответ, который я искал. Я не знал, что свойство тега даже существовало ... это огромная помощь. Огромное спасибо, я благодарен за тщательный ответ! –

+0

'Добро пожаловать. «Тег» весьма полезен, да. Сообщение UIView «viewWithTag:» может использоваться для поиска суб-представления по тегу, например. button = [view viewWithTag: index] (но это будет медленнее, чем доступ NSArray). По умолчанию tag == 0, поэтому я добавил номер BASE, если есть сиблинг-кнопки или представления. – squelart

+0

Да, теги очень удобны. Вы можете использовать их как прямые идентификаторы. Вы можете использовать их для поиска в словаре (после преобразования в NSNumber). Вы можете использовать их для выбора вида в случайном порядке - нечто вроде viewWithTag: (arc4random()% 8) – Amagrammer

8

Вы можете использовать GridView из moriarty library, чтобы помочь с layout - расположение каждой кнопки, где вы хотите. Построение частично на примере кода squelart в качестве метода createButtonAtRow: col: это может работать следующим образом:

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. 
Смежные вопросы