gpt4 book ai didi

objective-c - 基于 NSOutlineView 的 View 中的单元格是否在折叠时被释放?

转载 作者:行者123 更新时间:2023-12-03 17:03:22 25 4
gpt4 key购买 nike

我以前从未使用过 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];

最佳答案

NSOutlineView 有两种类型。一种是基于 View 的(使用更灵活的),另一种是基于单元格的。假设您使用的是基于 View 的,当您折叠项目时,大纲 View 中的 NSTableCellViews 将不会被释放。这些单元只是出队,即从屏幕上移除以供以后使用。

这样做是出于内存效率的原因。逻辑是“如果屏幕一次只能显示 20 个,为什么要分配 2000 多个 cellView?”因此,单元格将出队(稍后使用),并且通常不会释放。

但是,这种行为是不可预测的。如果您以标准方式设置代码,那么系统将管理单元。您无法 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 = 蓝色图像,其他 = 无图像。如果我没有重置单元格,当我崩溃时,某些单元格将具有其他单元格的旧值,因为它们正在被重用。

关于objective-c - 基于 NSOutlineView 的 View 中的单元格是否在折叠时被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20224866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com