1

在我的应用程序中,我有一个UITableView动态行数。一旦用户单击一个单元格,应用程序将导航到另一个单元格,UIView用户可以单击后退按钮转到UITableView. 返回时,我想突出显示选定的单元格并将单元格滚动到中心。这就是我实现它的方式

-(void) tableView:(UITableView *)tableView 
  willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath *)indexPath {

      if (!isScrollerSet && self.selectedRowNo!=-1) {

            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.selectedRowNo 
                                                        inSection:0];
            [self.tableViewP selectRowAtIndexPath:indexPath 
                                         animated:YES
                                   scrollPosition:UITableViewScrollPositionMiddle];
            isScrollerSet = YES;       
      }
}

当用户返回时,将在再次显示行时调用此方法。我在方法中设置了正确的行号didSelectRowAtIndexPath:

UITableView行数较少时,这可以正常工作。假设UITableVIew有 100 行,用户点击了第 90 行。当他回来时调用该didSelectRowAtIndexPath:方法时应用程序崩溃了。异常如下

*** Terminating app due to uncaught exception 'NSRangeException', 
    reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds 
    for empty array'

然后我将此代码移至viewDidAppear:. 现在它可以处理任意数量的行。我无法弄清楚为什么会这样。有人可以解释是什么原因吗?

4

2 回答 2

0

假设您没有有缺陷的代码,则可能:

-(void) tableView:(UITableView *)tableView 
  willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath *)indexPath

Datasource在你的初始化之前被调用。例如,如果你UITableView在函数中被实例化UIViewController's viewDidLoad,然后你在Datasource之后初始化你,那么在重新加载时UITableView你将有一个 nil 值。

viewDidAppear在运行时发生的较晚viewDidLoad,此时您Datasource是有效的,并且您可以在NSArray. 如果这是您的异常的原因,那么您可以通过DatasourceviewDidLoad.

根据您提供的信息,这是我最好的猜测。您可能想在问题中提供更多详细信息。

于 2013-10-09T18:46:00.703 回答
0
  • 在加载数据之前调用 tableView willDisplayCell 方法。因此,由于 tableview 中没有数据,它没有获取任何索引位置,因此它会显示错误

所以解决方案是您可以设置一个整数或任何其他变量并在 cellforRowAtindexpath 中检查它。当您返回时..(最好将值存储在 UserDafault 中)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   ...
   if(indexpath.row==<your value>)
   {
     // your code.
   }
....
}
于 2013-10-10T05:19:41.710 回答