it-swarm.com.ru

indexPathForCell возвращает ноль с 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?

18
Ludwig Meier

Ваш подход к поиску «закрывающей» ячейки табличного представления текстового поля хрупок, Потому что он предполагает фиксированную иерархию представлений (которая, кажется, изменилась между .__ iOS 6 и iOS 7).

Одним из возможных решений было бы пройти вверх по иерархии представлений, пока не будет найдена ячейка табличного представления:

UIView *view = textField;
while (view != nil && ![view isKindOfClass:[UITableViewCell class]]) {
    view = [view superview];
}
EditingCell *cell = (EditingCell *)view;

Совершенно другой, но часто используемый метод - пометить текстовое поле строкой Number:

cell.textField.tag = indexPath.row;   // in cellForRowAtIndexPath

а затем просто используйте этот тег в методах делегата текстового поля.

30
Martin R

Я находил клетки так же, как ты. Теперь я использую этот быстрый метод, если у меня есть кнопка в ячейке и я знаю, в каком табличном виде я нахожусь. Она вернет ячейку табличного вида. 

-(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id)sender {
    CGPoint pos = [sender convertPoint:CGPointZero toView:tableView];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:pos];
    return [tableView cellForRowAtIndexPath:indexPath];
}
22
drexel sharp

Испытывая эту проблему в 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
}
0
Steve