用| 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>
没有找到相关结果
已邀请:
1 个回复
董碘奴星
通话的原因。此外,单元格在设置时会复制其对象值,因此显然可以为其赋予新地址。 针对您发布的日志消息: 我尚不清楚这些日志的确切发布时间以及它们显示的内容,但我100%不清楚,但这看起来就像我希望看到的那样。在
中,您将打印字典中的值,该值与原始
相同。在
中,您要打印单元格的
,这是该原始文件的副本(即一个新的对象,在内存中具有不同的地址)。