Просмотр иерархий представлений с помощью .superview
(как демонстрируют все существующие ответы) - действительно плохой способ сделать что-то. Если структура UITableViewCell
изменится (что уже было раньше), ваше приложение сломается. Если в вашем коде указано .superview.superview
, то должны прозвучать сигналы тревоги.
Кнопка и ее обработчик должны быть добавлены в пользовательский подкласс UITableViewCell
и размещены там. Вот где оно принадлежит.
Подкласс ячейки может затем делегировать событие кнопки через стандартный интерфейс делегирования или блок. Вы должны стремиться к чему-то вроде этого:
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCustomCell *cell = ...;
// ...
cell.onButtonTapped = ^{
[self buttonSelectedAtIndexPath:indexPath];
}
// OR
cell.delegate = self;
// ...
}
(Примечание: если вы идете по блочному маршруту, вам нужно будет использовать __weak
самоссылку для предотвращения сохранения циклов, но я подумал, что это загромождает пример).
Если вы выберете маршрут делегата, вам потребуется следующий метод делегата:
- (void)cellButtonPressed:(UITableViewCell *)cell
{
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
// ...
}
Ваш код теперь имеет полный доступ к соответствующему контексту при обработке события.
Реализация этого интерфейса на вашем классе ячеек должна быть простой.