2009-11-10 5 views
1

Я создал табличный вид, который заполнен пользовательским UITableViewCell (like this). Каждая из ячеек содержит два UIButtons. Я назначаю действие такой кнопке:iPhone вид стола - некоторые кнопки/вопросы действия

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

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

Большое спасибо!

iYassin

ответ

3

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

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

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

- (void)decrease; 

к:

- (void)decrease:(id)sender; 

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

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

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

+0

Какая ссылка или какой тип данных является эта ссылка? Я просто попытался распечатать его на консоли с помощью NSLog, но это мгновенно закрыло мое приложение после нажатия кнопки. В общем, мой вопрос в следующем: как его использовать в моем методе? ;-) – iYassin

+1

Параметр 'sender' является экземпляром кнопки с событием. Поэтому вам придется как-то посмотреть, какая ячейка имеет эту кнопку. Вид раздражает и требует дополнительной информации о состоянии. Я бы переместил функцию уменьшения в класс Cell.Таким образом, вам не нужно ничего определять, вы уже будете в нужном месте и знаете, какая кнопка была нажата. –

+0

Что значит «переместить функцию уменьшения в класс Cell»? – iYassin

1

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

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

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

И у меня есть метод установки, так что я могу повторно INIT клетку, когда я из очереди его:

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

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