0

我的NSTableView主窗口 NIB 文件中有一个使用动态创建的数据源的文件 - 也就是说,字典数组是在需要时动态创建的 - 在我的一个类中。所以它不受 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:处理表格单元格内所有绘图(图像、文本、按钮等)的方法。每列包含一个字符串(第NSDictionary1 列)和(第 2 列)的对象引用。

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

NSLog(@"drawInteriorWithFrame: in cancelButtonCell - %@", [self objectValue]);

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

[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123456>

如果我在表格中单击或滚动,那么它应该为表格视图中的每个操作返回相同的值。但是,在第一次加载时,我会得到这样的结果:

[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x123af06>
[0000:000] drawInteriorWithFrame: in cancelButtonCell - <object: 0x12b3236>

如果有 2 个结果,那么我得到 3 个日志项,其他时候 4 个。在大多数情况下,该方法被调用的次数比它应该调用的次数多 1 次。

第二个问题是最近才出现的,如果您注意到上面的对象 ID,您会发现它们是不同的。如果我向数据源添加 1 项,当我调用 时[self objectValue],如果重新绘制表,则对象 ID 应该是相同的,因为它是一个参考 - 即。该对象已经-alloc在上一个类中,我只是发送对象引用。

我希望这是有道理的,但我在最后一天一直在敲打我的头,试图看看我是否错误地在任何地方复制了任何东西并且找不到任何问题。如果您需要更多代码,请告诉我。我也试过谷歌,但只参考了这个:

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>
4

1 回答 1

0

如果它显示正确,我认为没有什么可担心的。表格视图在完成绘制之前询问其表格列是否有“虚拟”单元格;我怀疑这是额外-draw...电话的原因。此外,单元格在设置时复制其对象值,因此显然会给它一个新地址。

针对您发布的日志消息:

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

于 2011-04-19T19:23:32.477 回答