Objective c 使用drawInteriorWithFrame:inView:子类化NSCell-[self-objectValue]返回奇怪的结果

Objective c 使用drawInteriorWithFrame:inView:子类化NSCell-[self-objectValue]返回奇怪的结果,objective-c,cocoa,xcode4,nscell,Objective C,Cocoa,Xcode4,Nscell,在我的主窗口NIB文件中有一个NSTableView,它在我的一个类中使用动态创建的数据源,也就是说,在需要时动态创建字典数组。因此它不受IB中任何控制器的约束 tableview有两个列,它们的子类为dataCell的集合 NSTableColumn *detailsColumn = [[tableView tableColumns] objectAtIndex:0]; imageColumnCell *fileDetails = [[[imageColumnCell alloc] init]

在我的主窗口NIB文件中有一个
NSTableView
,它在我的一个类中使用动态创建的数据源,也就是说,在需要时动态创建字典数组。因此它不受IB中任何控制器的约束

tableview有两个列,它们的子类为dataCell的集合

NSTableColumn *detailsColumn = [[tableView tableColumns] objectAtIndex:0];
imageColumnCell *fileDetails = [[[imageColumnCell alloc] init] autorelease];
[detailsColumn setDataCell:fileDetails];
[fileDetails setNumberOfUploads:numberOfFiles];

NSTableColumn *cancelColumn = [[tableView tableColumns] objectAtIndex:1];
cancelButtonCell *cancelCell = [[[cancelButtonCell alloc] init] autorelease];
[cancelColumn setDataCell:cancelCell];
文件中,
numberOfRowsInTableView:
被设置为动态创建的数组的正确计数,并且在绘制表时GDB会正确记录它

现在问题来了。出于假设的原因,假设数据源的数组计数为1

在两个子类的
NSCell
中,我都覆盖了
drawInteriorWithFrame:inView:
方法来处理表格单元格内的所有图形(图像、文本、按钮等)。每列的
NSDictionary
包含一个字符串(第1列)和一个对象引用(第2列)

基于数据源中1个对象的示例,如果在
drawInteriorWithFrame:inView:
I中,我将编写以下内容(在第2列中):

GDB中的预期结果(无需点击表格或滚动等)应为以下1个实例:

[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123456>
下面讨论的其他输出

来自GDB的输出 **1个文件,1个NSCell集合和子类** 在这里,请求保持不变-(即不复制)

[6619:903]
[6619:903]-(id)tableView:objectValueForTableColumn:row:/Users/byronrode/Desktop/Monika和Lubo/DSC_3379.jpg
[6619:903]imageColumnCell.m in-(void)drawInteriorWithFrame:inView:/Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903]-(id)表格视图:objectValueForTableColumn:行:
[6619:903]-(id)tableView:objectValueForTableColumn:row:/Users/byronrode/Desktop/Monika和Lubo/DSC_3379.jpg
[6619:903]imageColumnCell.m in-(void)drawInteriorWithFrame:inView:/Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903]-(id)表格视图:objectValueForTableColumn:行:
1个文件,2个NSCell集合和子类 在这里,请求在子类中更改-(即,不复制)

[6652:903]
[6652:903]-(id)tableView:objectValueForTableColumn:row:/Users/byronrode/Desktop/Monika和Lubo/DSC_3379.jpg
[6652:903]imageColumnCell.m in-(void)drawInteriorWithFrame:inView:/Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903]-(id)表格视图:objectValueForTableColumn:行:
[6652:903]取消按钮在-(无效)带边框的图纸内部:查看:
[6652:903]-(id)tableView:objectValueForTableColumn:row:/Users/byronrode/Desktop/Monika和Lubo/DSC_3379.jpg
[6652:903]imageColumnCell.m in-(void)drawInteriorWithFrame:inView:/Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903]-(id)表格视图:objectValueForTableColumn:行:
[6652:903]取消按钮在-(无效)带边框的图纸内部:查看:

如果显示正确,我不认为有什么好担心的。表格视图在完成表格列的绘图之前,会要求其表格列提供“虚拟”单元格;我怀疑这就是额外的
-draw…
调用的原因。此外,单元格在设置时复制其对象值,这样显然会给它一个新地址

针对您发布的日志消息:


我不是100%清楚这些日志到底是什么时候发布的,以及它们显示了什么,但这看起来像是我期望看到的。在
tableView:objectValueForTableColumn:row:
中,您正在打印字典中的值,该值与原始
ASIFormDataRequest
相同。在
drawInteriorWithFrame:inView:
中,您正在打印单元格的
objectValue
,它是原始单元格的副本(即,内存中具有不同地址的新对象)。

表是否显示不正确,或者您只是担心对
-drawInteriorWithFrame:
的明显额外调用?另外,在将所表示的对象传递到单元格之前,您是否查看了该对象?这与单元格所说的对象值相比如何?@josh caswell-表格显示正确(无额外数据)。在创建数据源的类中,实际对象、字典和包含字典的数组都包含相同的对象id。在数据源中,在
tableView:objectValueForTableColumn:row:
中,对象仍然被正确引用,但在我的NSCell子类中,引用发生了更改,所有额外的调用都与原始引用不同。我还注意到,
tableView:objectValueForTableColumn:row:
对于数据源中只有一行的两列表被调用了3次。在进一步的测试中,我发现“额外调用”与列数有关,在长时间不看它之后,这一点更加明显,因此这一部分是有意义的。现在的问题似乎是,如果我删除了第二个dataCell子类
cancelColumn
(如上),那么引用的对象就被正确识别了。我已经用我的
-tableView:objectValueForTableColumn:row:
方法更新了这个问题。您的两个表列是否使用相同的自定义单元格类?否。每个使用一个单独的单元类。它以前是一列,使用一个自定义单元格,但鼠标跟踪存在性能问题,因此我将其拆分,以便跟踪与需要单击跟踪的列相关。这是有道理的,但使用一个或两个自定义列单元格时,复制肯定是相同的。除非在这种情况下,地址在使用2个自定义单元格时发生更改。我为这个问题补充了更多的信息。也许现在会更有意义。在我看来,这些是AppKit实现细节,不会影响您的程序。我还是说“别担心”。为了高效地执行其作业,表视图、表列和
NSCell
都在后面执行操作
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123456>
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123af06>
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x12b3236>
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

  NSString *columnIdentifier = [tableColumn identifier]; 
  NSDictionary *theDict = [fileSourceArray objectAtIndex:row];

  MyAppMethods *appMethods = [MyAppMethods alloc];
  if([appMethods getIsComplete:self])
    return nil;

  if([columnIdentifier isEqualToString:@"fileCancel"]){
    if([[theDict objectForKey:columnIdentifier] isKindOfClass:[ASIFormDataRequest class]]){
      ASIFormDataRequest *fileUploadRequest = [theDict objectForKey:columnIdentifier];
      NSLog(@"in tableView:objectValueForTableColumn:row %@", fileUploadRequest);
      return fileUploadRequest;
    }
  }
  return [theDict objectForKey:columnIdentifier];
}
[6619:903] <ASIFormDataRequest: 0x10ca9b0>
[6619:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x10ca9b0>
[6619:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6619:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x10ca9b0>
[6652:903] <ASIFormDataRequest: 0x103b390>
[6652:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x103b390>
[6652:903] cancelButtonCell.m in - (void)drawInteriorWithFrame:inView: <ASIFormDataRequest: 0x1221b00>
[6652:903] - (id)tableView:objectValueForTableColumn:row: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] imageColumnCell.m in - (void)drawInteriorWithFrame:inView: /Users/byronrode/Desktop/Monika and Lubo/DSC_3379.jpg
[6652:903] - (id)tableView:objectValueForTableColumn:row: <ASIFormDataRequest: 0x103b390>
[6652:903] cancelButtonCell.m in - (void)drawInteriorWithFrame:inView: <ASIFormDataRequest: 0x1227100>