Когда я задал этот вопрос, я имел в виду, в ситуации, когда у меня есть пользовательские ячейки с помощью кнопок на них, как может TableViewController знать, какие кнопки ячейки прослушивался. Совсем недавно, читая книгу «IOS рецепты», я получил решение:
-(IBAction)cellButtonTapped:(id)sender
{
NSLog(@"%s", __FUNCTION__);
UIButton *button = sender;
//Convert the tapped point to the tableView coordinate system
CGPoint correctedPoint = [button convertPoint:button.bounds.origin toView:self.tableView];
//Get the cell at that point
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:correctedPoint];
NSLog(@"Button tapped in row %d", indexPath.row);
}
Другого решения, немного более хрупкие (хотя проще) будет:
- (IBAction)cellButtonTapped:(id)sender
{
// Go get the enclosing cell manually
UITableViewCell *parentCell = [[sender superview] superview];
NSIndexPath *pathForButton = [self.tableView indexPathForCell:parentCell];
}
И самым многоразовые один можно было бы добавить этот метод к категории UITableView
- (NSIndexPath *)prp_indexPathForRowContainingView:(UIView *)view
{
CGPoint correctedPoint = [view convertPoint:view.bounds.origin toView:self];
return [self indexPathForRowAtPoint:correctedPoint];
}
А потом, на классе UITableViewController, просто используйте:
- (IBAction)cellButtonTapped:(id)sender
{
NSIndexPath *pathForButton = [self.tableView indexPathForRowContainingView:sender];
}
Пятно на. Проблема номер один, которая, как я вижу, обычно нарушается, заключается в «разделении проблем». –
Спасибо, Дэвид! Ваш ответ также заставило меня понять больше о шаблоне делегирования и свободной связи в iOS для создания кода многократного использования. – Giovanni