indexPathForCell returns nil since ios7

匿名 (未验证) 提交于 2019-12-03 02:08:02

问题:

my app was running fine under ios6.1. tried the ios7 simulator and the following part does not work:

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]; 

It always comes:

the section is 0 and row is 0 

although another section / row were selected. Has someone an idea why this does not work under ios7?

回答1:

Your approach to find the "enclosing" table view cell of a text field is fragile, because is assumes a fixed view hierarchy (which seems to have changed between iOS 6 and iOS 7).

One possible solution would be to traverse up in the view hierarchy until the table view cell is found:

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

A completely different, but often used method is to "tag" the text field with the row number:

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

and then just use that tag in the text field delegate methods.



回答2:

I was finding cells the same way you were. Now I use this quick method if I have a button in a cell and know the tableview I'm in. It'll return the 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:

Experiencing this problem in iOS 11, but not in 9 or 10, I overrode the func indexPath(for cell: UITableViewCell) -> IndexPath? method using the technique that @drexel-sharp detailed previously:

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 } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!