2012-01-31 126 views
16

我有一个赛格瑞在那里我试图让当前所选行一个UITableViewController:indexPathForSelectedRow返回nil

-(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。如果我添加:

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

selectedIndexPath有效。所以,我目前假设该行以某种方式被取消选中。任何人都可以告诉我如何确定是否是这种情况以及可能导致它的原因?

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

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

回答

1

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

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

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

我把所有的类代码都复制过来了,原型单元结束了,它仍然有效!

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

Storyboard screen shot

22

一个可能的原因是,你在的UITableViewDelegate方法之一书面的东西 -

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

这是一个常见的做法是deselect the row刚刚被选中。

+8

对我来说,我是取消了我的排。 “卫生署! – Baub 2012-04-26 23:36:17

9

可以肯定,你是不是要求得到选中行的索引路径之前deselectRowAtIndexPath方法。

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

reloadData也可能导致取消行 – foOg 2016-04-05 09:48:36

0

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

2

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

和删除以下行:下面两行

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

工作对我来说:

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

希望能与我的情况 “从UIButton的细胞叫赛格瑞” 的作品为他人也。

+0

这是完美的,我正在做类似的事情。我不得不重新加载特定的单元格,但由于该部分在滚动时发生更改,我无法再更新。这里是我与你的答案一起使用NSArray * indexPathArray = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:indexPathSectionRow.row inSection:indexPathSectionRow.section]]; [self.nationalTableView reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade]; – 2018-02-03 04:02:54

12

某些可能会帮助他人的东西 - 如果您在桌面视图上调用reloadData(),则会诋毁indexPathForSelectedRow

+1

这个令人惊讶的简单发现刚刚救了我几个小时;) – 2017-01-06 18:46:14

+0

感谢兄弟!!!它真的有帮助 – SamuelChan 2017-05-23 11:59:18