IndexPathForCell возвращает nil, поскольку ios7
мое приложение работало нормально под ios6.1. попробовал симулятор ios7, и следующая часть не работает:
EditingCell *cell = (EditingCell*) [[textField superview] superview];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
NSLog(@"the section is %d and row is %d", indexPath.section, indexPath.row);
NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];
NSString *rowKey = [[keysForRows objectAtIndex: section] objectAtIndex: row];
Он всегда приходит:
the section is 0 and row is 0
хотя был выбран другой раздел/строка.
У кого-то есть идея, почему это не работает под ios7?
Ответы
Ответ 1
Ваш подход к поиску "закрывающей" ячейки таблицы таблицы текстового поля является хрупким,
потому что предполагает фиксированную иерархию представлений (которая, по-видимому, изменилась между
iOS 6 и iOS 7).
Одним из возможных решений могло бы стать перемещение в иерархии представлений до тех пор, пока не будет найдена ячейка просмотра таблицы:
UIView *view = textField;
while (view != nil && ![view isKindOfClass:[UITableViewCell class]]) {
view = [view superview];
}
EditingCell *cell = (EditingCell *)view;
Совершенно другой, но часто используемый метод - "пометить" текстовое поле строкой
номер:
cell.textField.tag = indexPath.row; // in cellForRowAtIndexPath
а затем просто используйте этот тег в методах делегата текстового поля.
Ответ 2
Я находил камеры так же, как и вы. Теперь я использую этот быстрый метод, если у меня есть кнопка в ячейке и знаю таблицу, в которой я нахожусь. Она вернет tableviewcell.
-(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id)sender {
CGPoint pos = [sender convertPoint:CGPointZero toView:tableView];
NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:pos];
return [tableView cellForRowAtIndexPath:indexPath];
}
Ответ 3
Испытывая эту проблему в iOS 11, но не в 9 или 10, я переопределяю метод func indexPath(for cell: UITableViewCell) -> IndexPath?
, используя технику, описанную ранее drexel-sharp:
override func indexPath(for cell: UITableViewCell) -> IndexPath? {
var indexPath = super.indexPath(for: cell)
if indexPath == nil { // TODO: iOS 11 Bug?
let point = cell.convert(CGPoint.zero, to: self)
indexPath = indexPathForRow(at: point)
}
return indexPath
}