【发布时间】:2012-05-23 21:37:42
【问题描述】:
我有一个 NSTableView,它的数据源是一个 NSMutableArray。数组的计数在 numberOfRowsInTableView: 方法中返回。
通过在其他组件中进行选择来刷新表格,例如 NSPopupButton,它会更改数组的内容并执行 reloadData 方法。
问题是有时我会得到一种数据被相互写入。因此,例如,如果计数为 4,然后在执行操作后为 10,则额外的 6 条记录写入前 4 条下方。只有在我手动上下滚动表格后,数据(正确的数据)才是显示出来。
控制台显示一条消息
-[NSCFArray objectAtIndex:]: index(-1(or possibly larger)) beyond bounds (1056).
我知道错误消息似乎指出它是一个超出范围的数组,但是当我只返回时,这怎么可能呢,比如
中的 [array objectAtIndex: rowIndex]- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
方法?
此外,numberOfRowsInTableView 中返回的计数返回始终是正确的(我知道这一点,因为我每隔几秒就使用计时器记录计数)。
有什么想法吗?谢谢!
编辑 1: 我返回的数据如下:
pc = [[PrinterClass alloc]init];
pc = [ads_printers_array objectAtIndex:rowIndex];
if (aTableColumn == tc_make)
return [pc make];
if (aTableColumn == tc_model)
return [pc model];
if (aTableColumn == tc_driver_name)
return [pc ppd];
if (aTableColumn == tc_rdp_driver)
{
if ([pc decider] == 1)
return [pc rdp];
else return [pc model];
}
我上面提到的数组中填充了我创建的一个名为 PrintersClass 的类的对象。
要重新加载数据,它只是像往常一样重新加载数据:
[ads_rdp_driver_table reloadData];
ads_rdp_driver_table 是 tableView 名称。
问题是这个问题是随机出现的,而不是在特定的点上。这就是为什么我不能指望它..
【问题讨论】:
-
如果您可以发布更多代码,尤其是在您调用 reloadData 以及 numberOfRowsInSection 和 cellForRowAtIndexPath 方法的地方,那就太好了
-
为什么不在 Objective-C 异常上设置断点,当你收到数组越界消息时,打印出索引和数组计数?
-
pc = [[PrinterClass alloc] init];后跟pc = [ads_printers_array objectAtIndex:rowIndex]没有意义。我建议删除第一行,它没有任何用处。 -
发布更多控制器代码可能会有所帮助。
-numberOfRowsInTableView,-tableView:objectValueForTableColumn:的全身。 -
最后,我不明白这是什么意思:“例如,如果计数为 4,然后执行操作后为 10,则额外的 6 条记录写在前 4 条下方。 "这听起来像是正确的行为。
标签: objective-c cocoa nstableview