调用selectRowAtIndexPath时应用程序崩溃

时间:2013-10-09 13:36:46

标签: iphone objective-c uitableview

在我的应用程序中,我有一个动态行数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:。现在它与任意数量的行有关。我无法弄清楚为什么会这样。有人可以解释是什么原因吗?

2 个答案:

答案 0 :(得分:0)

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

-(void) tableView:(UITableView *)tableView 
  willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath *)indexPath
Datasource初始化之前调用

。例如,如果您在UITableView函数中实例化UIViewController's viewDidLoad,然后在之后初始化Datasource,那么在重新加载UITableView后,您将获得零值。

虽然viewDidAppear在运行时中发生的时间早于viewDidLoad,所以此时Datasource有效且您可以在NSArray中引用该索引。如果这是您的例外原因,那么您可以通过在Datasource的最开始进行viewDidLoad初始化来解决此问题。

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

答案 1 :(得分:0)

  • tableView willDisplayCell 在加载数据之前调用方法。因为tableview中没有数据,所以它会显示错误,因为它没有得到任何索引位置

所以解决方法是你可以设置一个整数或任何其他变量并在cellforRowAtindexpath中检查它。当你返回..(更好地在UserDafault中存储价值)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   ...
   if(indexpath.row==<your value>)
   {
     // your code.
   }
....
}