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

|| 我的主窗口NIB文件中有一个“ 0”,它使用动态创建的数据源-也就是说,在需要时在我的一个类中动态创建字典的数组。因此,它不受IB中任何控制器的约束。 tableview有2列,其子类化为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];
<NSTableViewDataSource>
文件中,将
numberOfRowsInTableView:
设置为动态创建的数组的正确计数,并且在绘制表时GDB会正确记录该数组。 现在问题来了。出于假设的原因,假设数据源的数组计数为1 在这两个子类别
NSCell
中,我都覆盖了
drawInteriorWithFrame:inView:
方法来处理表格单元中的所有图形(图像,文本,按钮等)。每列的“ 6”包含一个字符串(第1列)和一个对象引用(第2列)。 基于数据源中1个对象的示例,如果在ѭ5中,我将编写以下内容(在第2栏中):
NSLog(@\"drawInteriorWithFrame: in cancelButtonCell - %@\", [self objectValue]);
GDB中的预期结果(无需单击表或滚动等)应为以下情况的1个实例:
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123456>
而且,如果我单击或滚动表,则它应该为tableview中的每个操作返回相同的值。但是,在第一次加载时,我得到的是这样的:
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123af06>
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x12b3236>
如果有2个结果,那么我得到3个日志项,其他时候为4。在大多数情况下,该方法的调用时间比应有的多1倍。 第二个问题是最近才出现的,如果您注意到上面的对象ID,您会发现它们是不同的。如果我向数据源添加1个项目,则在调用
[self objectValue]
时,如果重绘了表,则对象ID应该相同,因为它是一个引用-即。该对象在上一课中已经是
-alloc
\',而我只是发送对象引用。 我希望这是有道理的,但是在最后一天,我一直在努力思考,看看我是否在任何地方错误地复制了任何东西而找不到任何问题。如果您需要更多代码,请告诉我。我也尝试过Google,并且仅参考了以下内容: http://forum.soft32.com/mac/NSPopUpButtonCell-view-refresh-ftopict46690.html 提前致谢。
- (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];
}
额外的输出,在下面进行讨论。 GDB的输出 ** 1个文件,1个NSCell集和子类化** 这里的请求保持不变-(即无复制)
[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>
1个文件,2个NSCell的集合并子类化 这里的请求在子类中发生了变化-(即无复制)
[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>
    
已邀请:
我认为如果显示正确没有什么可担心的。表格视图在完成绘制之前向其表格列询问“虚拟”单元格;我怀疑这是额外的
-draw...
通话的原因。此外,单元格在设置时会复制其对象值,因此显然可以为其赋予新地址。 针对您发布的日志消息: 我尚不清楚这些日志的确切发布时间以及它们显示的内容,但我100%不清楚,但这看起来就像我希望看到的那样。在
tableView:objectValueForTableColumn:row:
中,您将打印字典中的值,该值与原始
ASIFormDataRequest
相同。在
drawInteriorWithFrame:inView:
中,您要打印单元格的
objectValue
,这是该原始文件的副本(即一个新的对象,在内存中具有不同的地址)。     

要回复问题请先登录注册