indexPathForSelectedRow返回nil

我有一个UIVableViewController与我试图得到当前选定的行的segue:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([[segue identifier] isEqualToString:@"EditFilterElementSegue"]){ // Get the element that was clicked and pass it to the view controller for display NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; Element *element = [fetchedResultsController objectAtIndexPath:selectedIndexPath]; FilterElementTableViewController *vc = segue.destinationViewController; vc.filter = filter; vc.element = element; } } 

问题是indexPathForSelectedRow返回nil。 文档说,如果索引path无效,返回nil。 如果我添加:

  [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:0]; selectedIndexPath = [self.tableView indexPathForSelectedRow]; 

selectedIndexPath有效。 所以,我现在假设这个行在某种程度上被取消了。 谁能告诉我如何确定是否是这种情况,可能是什么原因造成的?

此代码工作正常,直到我转换为使用NSFetchedResultsController(否则工作)。 我也在其他几个表视图控制器中使用indexPathForSelectedRow工作正常(其中之一也使用NSFetchedResultsController)。

我也尝试了在didSelectRowAtIndexPath,但同样的事情发生在那里。 (因为它是在prepareForSegue之后被调用的)。

一个可能的原因是你已经写了一个UITableViewDelegate方法之一 –

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ } 

deselect the rowdeselect the row是一种常见的做法。

有些东西可以帮助别人 – 如果你在你的表视图上调用reloadData() ,它将会使indexPathForSelectedRow

请确定,在获取所选行的索引path之前,您没有调用deselectRowAtIndexPath方法。

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; //add this line after setting indexPath } 

好的,底线是故事板中的场景被搞砸了。

为了弄清楚,我删除了segue,并创build了一个全新的空UITableViewController类,只添加了足够的代码,所以我可以点击一行并查看indexPathForSelectedRow。 还是零。

然后,我在故事板中创build了一个新的UITableViewController,并replace了现有的一个。 现在indexPathForSelectedRow工作。

我把所有的类代码都复制过来了,原型单元格覆盖了,它仍然可以工作!

出于好奇,我看了两个场景的故事板源,注意到那个不工作的场景比新的要长得多。 看看故事板的轮廓,很明显,为什么,而且令人惊讶,它的工作。 而且,现在我记得在切割和粘贴原型单元时遇到麻烦。 猜猜我应该更频繁地看大纲模式。 看到下面的屏幕截图(视觉场景看起来一样):

故事板屏幕截图

好的在我的情况下,我正在通过show segue在故事板上从UIButton调用。

并删除以下行:

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

以下2行为我工作:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];

希望与我的情况“呼吁从细胞UIButton赛格”也适用于其他人。

我也有这个问题,当我用代码中的UIViewController类replace了UITableViewController类,并没有更新故事板,即,我没有用UIViewController storyboard取代故事板中的UITableViewController占位符。