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 row
刚deselect 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占位符。