просмотр таблицы iPhone - некоторые вопросы о кнопках / действиях - PullRequest
1 голос
/ 10 ноября 2009

Я создал табличное представление, заполненное пользовательским UITableViewCell (, например ). Каждая из ячеек содержит две кнопки UIB. Я назначаю действие кнопке следующим образом:

 [decreaseButton addTarget:self action:@selector(decrease) forControlEvents:UIControlEventTouchUpInside];

Это правильный путь? В любом случае, это работает, но в моем методе «уменьшения» мне нужно знать, в какой из моих 18-ти строк табличного представления была нажата кнопка. Конечно, indexPath.row не работает вне метода cellForRowAtIndexPath. Может кто-нибудь объяснить мне, как это сделать?

Заранее большое спасибо!

iYassin

Ответы [ 2 ]

3 голосов
/ 10 ноября 2009

Вы можете сделать это двумя способами.

Проверка отправителя события

Измените свой метод уменьшения с:

- (void)decrease;

до:

- (void)decrease:(id)sender;

Таким образом, когда вызывается уменьшение, вам дадут ссылку на кнопку, у которой было событие касания внутри.

Определить метод уменьшения ближе к информации

Другим решением было бы иметь разные целевые экземпляры для каждой кнопки (например, реализовать функцию уменьшения как часть пользовательской ячейки). Таким образом, вы знаете, что кнопка, к которой вы прикоснулись, была кнопкой текущей ячейки.

1 голос
/ 11 ноября 2009

Способ, которым я решил это, заключается в том, что я отслеживаю данные, которые могут понадобиться внутри моего пользовательского объекта ячейки. И кнопка подключена не к внешнему приемнику, а к самой ячейке, которая, в свою очередь, знает, как вызвать реальный получатель действия.

Я делаю свою клетку с чем-то вроде:

cell = [[MyTableViewCell alloc] initWithStyle:style 
                              reuseIdentifier:CellIdentifier];

И у меня есть метод настройки, чтобы я мог заново инициировать ячейку, когда снимаю ее с очереди:

[cell setupMyCellWithContext:objectID 
                      target:[[UIApplication sharedApplication] delegate] 
                      action:@selector(someAction)];

поэтому внутри вашего класса ячеек вы используете действие и цель, которые были отправлены в методе установки, чтобы вызвать истинную цель:

- (void)doAction:(id)sender {
    if ([target respondsToSelector:action]) {
        [target performSelector:action withObject:objectID afterDelay:0];
    }
}

Поэтому, когда ваш пользователь нажимает кнопку, ОС вызывает [cell doAction:], которая вызывает выбранный ранее целевой объект и селектор действий с правильным контекстным объектом.

...