我正在构建一个扫描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;
}