可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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 }