我之前从未使用过NSOutlineView,我很好奇是否在项目崩溃时细胞被释放并解除分配?
每次展开和折叠项目后,我觉得我的细胞堆叠在一起。
非常感谢任何形式的帮助!
HSObjectViewModel* ovm = item;
HSObjectTableCellView *oCell = [outlineView makeViewWithIdentifier:@"OutlineCell"
owner:self];
oCell.textField.stringValue = ovm.hsObject.name;
NSImage* im = [[NSImage alloc] init];
if(ovm.isVisible) {
im = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"on" ofType:@"png"]];
} else {
im = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"off" ofType:@"png"]];
}
[oCell.eyeButton setImage:im];
oCell.eyeButton.target = self;
oCell.eyeButton.action = @selector(visibilityButtonClicked:);
[[oCell.eyeButton cell] setHighlightsBy:0];
答案 0 :(得分:2)
有两种类型的NSOutlineView。一种是基于视图(使用的更灵活),另一种是基于单元的。假设您使用的是基于视图的内容,则在折叠项目时,大纲视图中的NSTableCellViews
将不会被取消分配。这些单元只是被排队,即从屏幕上移除以便稍后使用。
这是出于记忆效率的原因。逻辑是“如果屏幕一次只能显示20个,为什么要分配2000+ cellViews?”因此,细胞将被排队(稍后使用)而不是解除分配通常。
但是,这种行为是不可预测的。如果以标准方式设置代码,则系统将管理单元格。当细胞被解除分配时,您无法100%确定。如果您的用户可以从NSOutlineView中删除单元格,那么单元格被取消分配的可能性会增加。
<强> - 编辑 - 强>
根据以下注释,您需要在将单元格出列后重置单元格。假设您的代码看起来像这样。
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSTableCellView *aCellView = [outlineView makeViewWithIdentifier:[tableColumn identifier] owner:self];
// You can reset the cell like so
if (item.status == 0) { // Assuming your item has a property called status (you can make what ever property you want)
aCellView.imageView.image = [NSImage imageNamed:@"redImage"];
} else if (item.status == 1) {
aCellView.imageView.image = [NSImage imageNamed:@"blueImage"];
} else {
aCellView.imageView.image = nil;
}
}
所以基本上,您会观察项目的属性(您应该声明的属性以区分哪个项目是什么),并根据属性重置单元格以显示正确的值。在上面的示例中,单元格具有图像状态0 =红色图像,1 =蓝色图像,其他任何东西=无图像。如果我没有重置细胞,当我崩溃时,一些细胞将具有其他细胞的旧值,因为它们被重复使用。