【问题标题】:NSTableView doesn't refresh?NSTableView 不刷新?
【发布时间】: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


【解决方案1】:

您是否 100% 确定已连接代理和数据源?

你也可以在代码中做到这一点

ads_rdp_driver_table.datasource = self;
ads_rdp_driver_table.delegate = self;

添加这是在 f.ex 中。从笔尖醒来。

你还必须将tableview本身连接到一个iboutlet,否则你不能通过名字来调用它。

【讨论】:

  • 是的,一切都已连接。正如我所说,这只会在我更改 nspopupbutton 中的选项时随机发生,除此之外它工作得很好。
  • 您检查过可变数组的计数状态吗?我会做一个 NSLog("The array is : %d", array.count);每次刷新
  • 是的,我检查过它总是返回正确的计数......“另外,返回的计数返回 numberOfRowsInTableView 总是正确的(我知道这一点,因为我正在使用每隔几秒就有一个计时器)。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多