基于NSOutlineView的视图中的单元格是否在崩溃时被释放?

时间:2013-11-26 18:17:24

标签: objective-c macos cocoa nsoutlineview

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

1 个答案:

答案 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 =蓝色图像,其他任何东西=无图像。如果我没有重置细胞,当我崩溃时,一些细胞将具有其他细胞的旧值,因为它们被重复使用。