indexPathForSelectedRow返回nil

Sym*_*ric 18 null uitableview ios

我有一个带有segue的UITableViewController,我正在尝试获取当前选定的行:

-(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是indexPathForSelectedRow返回nil.文档说"如果索引路径无效",则返回nil.如果我添加:

        [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:0];
        selectedIndexPath = [self.tableView indexPathForSelectedRow];
Run Code Online (Sandbox Code Playgroud)

selectedIndexPath有效.所以,我现在假设该行以某种方式未被选中.任何人都可以告诉我如何判断是否是这种情况以及可能导致它的原因?

这段代码工作正常,直到我转换为使用NSFetchedResultsController(否则它正在工作).我还在几个其他表视图控制器中使用indexPathForSelectedRow,它可以正常工作(其中一个也使用NSFetchedResultsController).

我也试过打破didSelectRowAtIndexPath,但同样的事情发生在那里.(预计因为它是在prepareForSegue之后调用的.)

Chr*_*hen 25

可能的原因是你在其中一种UITableViewDelegate方法中写了一些东西-

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
}
Run Code Online (Sandbox Code Playgroud)

这是deselect the row刚刚选择的常见做法.

更新:

在Swift 4.2中,xcode 10:

只需评论该行

tableView.deselectRow(at: indexPath, animated: true)
Run Code Online (Sandbox Code Playgroud)

在功能中

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,我取消了我的排."卫生署! (8认同)

Nat*_* R. 19

可以帮助他人的东西 - 如果你打电话reloadData()给你的桌子视图,它会玷污他们indexPathForSelectedRow.


Bal*_*ngh 11

确保deselectRowAtIndexPath在获取所选行的索引路径之前,您没有调用方法.

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


Sym*_*ric 1

好吧,最重要的是故事板中的场景被搞乱了。

为了弄清楚这一点,我删除了segue并创建了一个全新的空UITableViewController类,并且只添加了足够的代码,以便我可以单击一行并查看indexPathForSelectedRow。仍然是零。

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

我复制了所有类代码和原型单元,它仍然有效!

出于好奇,我查看了这两个场景的故事板源,发现不起作用的场景比新场景长得多。看看故事板大纲,原因显而易见,而且令人惊讶的是它竟然有效。而且,现在我记得在剪切和粘贴原型单元时遇到了麻烦。我想我应该更频繁地查看大纲模式。请参阅下面的屏幕截图(视觉场景看起来相同):

故事板屏幕截图