Способ, которым я решил это, заключается в том, что я отслеживаю данные, которые могут понадобиться внутри моего пользовательского объекта ячейки. И кнопка подключена не к внешнему приемнику, а к самой ячейке, которая, в свою очередь, знает, как вызвать реальный получатель действия.
Я делаю свою клетку с чем-то вроде:
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:], которая вызывает выбранный ранее целевой объект и селектор действий с правильным контекстным объектом.