Как я могу отслеживать путь индекса кнопки в таблице View Cell?
-
30-09-2019 - |
Вопрос
У меня есть представление на столе, где каждая ячейка имеет вид на кнопку аксессуар. Таблица управляется привлеченным контроллером результатов и часто переупорядочена. Я хочу иметь возможность нажать одну из кнопок и получить клетку просмотра индекса в таблице этой кнопки. Я пытался заставить эту работу в течение нескольких дней, хранив строку кнопки в его теге, но когда таблица переупорядочена, строка становится неправильной, и я продолжаю переуправлять теги правильно. Любые новые идеи о том, как отслеживать путь индекса клетки кнопки?
Решение
Я создал один метод получения индекса, надеюсь, что это поможет вам.
Создать действие кнопки (Amethod :) в CellForeatindexpath
-(void) aMethod:(UIButton *)sender
{
// Calling Magic Method which will return us indexPath.
NSIndexPath *indexPath = [self getButtonIndexPath:sender];
NSLog(@"IndexPath: %li", indexPath.row);
NSLog(@"IndexRow: %li", indexPath.section);
}
// Вот магический метод для получения индекса кнопки
-(NSIndexPath *) getButtonIndexPath:(UIButton *) button
{
CGRect buttonFrame = [button convertRect:button.bounds toView:groupTable];
return [groupTable indexPathForRowAtPoint:buttonFrame.origin];
}
Другие советы
Если вам неудобно полагаться на button.superview
, Этот метод должен быть немного более надежным, чем некоторые другие ответы здесь:
UIButton *button = (UIButton *)sender;
CGRect buttonFrame = [button convertRect:button.bounds toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonFrame.origin];
Это перестало работать с iOS 7; проверить Ответ Майка Веллера вместо
- (IBAction)clickedButton:(id)sender {
UIButton *button = (UIButton *)sender;
UITableViewCell *cell = (UITableViewCell *)button.superview;
UITableView *tableView = (UITableView *)cell.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
}
Или короче:
- (IBAction)clickedButton:(id)sender {
NSIndexPath *indexPath = [(UITableView *)sender.superview.superview indexPathForCell:(UITableViewCell *)sender.superview];
}
Оба непроверены!
Ползание взгляда иерархии с .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];
// ...
}
Ваш код теперь имеет полный доступ к соответствующему контексту, когда он обрабатывает событие.
Реализация этого интерфейса на вашем классе клеток должно быть простым.
Я не знаю, почему мне нужно добавить руководящий способ дважды, чтобы получить UiableViewCell.
Обновлять:
Спасибо за Qiulang, теперь я получил его.
«Это потому, что SDK теперь добавил частный класс под названием UiableViewCellContentView для UiableViewCell, который сейчас является руководством кнопки». - qiulang
UIButton *button = (UIButton *)sender;
UITableViewCell *cell = (UITableViewCell *)button.superview.superview;
UITableView *curTableView = (UITableView *)cell.superview;
NSIndexPath *indexPath = [curTableView indexPathForCell:cell];
У меня также имел эту же проблему и построил простой рекурсивный метод, который работает независимо от того, сколько взглядов глубоко вы вызываете контроль.
-(NSIndexPath*)GetIndexPathFromSender:(id)sender{
if(!sender) { return nil; }
if([sender isKindOfClass:[UITableViewCell class]])
{
UITableViewCell *cell = sender;
return [self.tableView indexPathForCell:cell];
}
return [self GetIndexPathFromSender:((UIView*)[sender superview])];
}
-(void)ButtonClicked:(id)sender{
NSIndexPath *indexPath = [self GetIndexPathFromSender:sender];
}
Используйте эту идеальную работу для меня.
CGPoint center= [sender center];
CGPoint rootViewPoint = [[sender superview] convertPoint:center toView:_tableView1];
NSIndexPath *indexPath = [_tableView1 indexPathForRowAtPoint:rootViewPoint];
NSLog(@"%@",indexPath);
Swift 2 Update
Вот как выяснить, какая кнопка была постугнута
@IBAction func yourButton(sender: AnyObject) {
var position: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
let indexPath = self.tableView.indexPathForRowAtPoint(position)
let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath!)! as
UITableViewCell
print(indexPath?.row)
print("Tap tap tap tap")
}