越界" NSRangeException"在UITableView上滚动时

时间:2014-07-30 16:55:21

标签: ios objective-c uitableview ios7

我正在构建一个扫描Amazon Dynamo数据库数据库的简单目录应用程序,并以树状结构呈现数据。数据库中的某些项目只有子项,而其他项目除了子项外还包含地址和电话号码详细信息。详细信息项在数据库中没有自己的条目 - 它们只在另一个项目中有一个字段,这会使数据库的大小减少非常重要的数量。

当我的UITableView必须同时显示细节和子项时,它会变得有点棘手。详细信息将加载到屏幕顶部,每次加载详细信息时,我都会增加_arrayOffset。从indexPath.row中减去_arrayOffset,以便从index [0]开始使用子数组正确填充表。当列表可以在不滚动的情况下显示时,这非常有效。但是,如果我向下滚动细节并备份,我会立即得到一个NSRangeException。在我看的特殊情况下,我有22个孩子要展示,还有1个细节。错误说:

Terminating app due to uncaught exception 'NSRangeException', reason '***
-[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 22]'

我知道4294967295是(2 ^ 32) - 1,所以我非常肯定发生的事情是,当我的细节重新加载到表的顶部时,它会再次递增我的_arrayOffset,然后是UITableView尝试使用索引-1处的项目。

我该如何避免这种情况?有没有办法只在第一次加载细节时递增_arrayOffset?我可以一次增加UITableView加载的单元格数量,如果我必须一次加载50个单元格,它会减慢太多吗?如果我的无代码问题不足以回答任何问题,有人可以帮助我理解UITableView如何重用单元格以便我可以更好地调试它吗?

编辑1:

索引由cellForRowAtIndexPath生成:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

然后

if (containsDetails)
{
    // Add the details to cell.detailTextLabel
    self.arrayOffset++
}

然后......

// If _tableRows isn't empty
if (_tableRows.count)
{
    DDBTableRow *item = self.tableRows[indexPath.row-self.arrayOffset];
    cell.textLabel.text = item.title;
    cell.detailTextLabel.text = nil;
 }

编辑2:

我不相信numberOfRowsInSection是罪魁祸首,但无论如何我都会发布它。 rowCount一直都是正确的,即使在崩溃时也是如此。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    // If we're displaying details, check to see if the item has a phone number, fax, and address.
    // Add one to rowCount for phone number and fax. For address, add two, so we can display a dummy
    // cell at the end. If we don't do this, the size of every cell will be the size of the address
    // cell (big) and that looks messy.

    NSInteger rowCount = 0;

    if (self.showDetails == YES)
    {
        if ([_tableRow.phone length] > 0)
        {
            rowCount++;
        }
        if ([_tableRow.fax length] > 0)
        {
            rowCount++;
        }
        if ([_tableRow.address length] > 0)
        {
            rowCount++;
            rowCount++;
        }
    }

    rowCount += [self.tableRows count];

    return rowCount;
}

0 个答案:

没有答案