我的主窗口NIB文件中有一个NSTableView
,它使用动态创建的数据源 - 也就是说,字典数组是在需要时动态创建的 - 在我的一个类中。所以它不受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:
方法来处理表格单元格内的所有绘图(图像,文本,按钮等)。每列的NSDictionary
包含一个字符串(第1列)和(第2列)的对象引用。
基于数据源中1个对象的示例,如果在drawInteriorWithFrame:inView:
中,我将编写以下内容(在第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
',我只是发送对象引用。
我希望这是有道理的,但是我在最后一天一直在试着看我是否错误地在任何地方复制任何东西而且找不到任何问题。如果您需要更多代码,请告诉我。我也尝试过谷歌并且只参考了这个:
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];
}
下面讨论的其他输出。
** 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>
此处请求在子类中更改 - (即无复制)
[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>
答案 0 :(得分:0)
如果显示正确,我认为没有什么可担心的。在最终确定绘图之前,表视图会在其表格列中询问“虚拟”单元格;我怀疑这是额外-draw...
电话的原因。此外,单元格在设置时复制其对象值,因此显然会给它一个新地址。
回复您发布的日志消息:
我不是100%清楚这些日志何时被发布,以及它们正在显示什么,但这看起来像我期望看到的。在tableView:objectValueForTableColumn:row:
中,您将打印字典中的值,该值与原始ASIFormDataRequest
相同。在drawInteriorWithFrame:inView:
中,您打印的是单元格objectValue
,它是该原始文件的副本(即新对象,内存中的地址不同)。