2013-11-26 52 views
1

我從來沒有與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]; 
+0

對不起,只是編輯了這個問題......這是一個基於一個觀點 –

回答

2

有兩種類型的NSOutlineView。一種是基於視圖(更靈活的使用),另一種是基於細胞的。假設您使用基於視圖的方式,當您摺疊項目時,大綱視圖中的NSTableCellViews不會取消分配。細胞只是從隊列中取出,即從屏幕上移除以備後用。

這是爲了記憶效率的原因。邏輯是「如果屏幕一次只能顯示20個,爲什麼分配可以說2000+個cellView?」所以這些單元將被取消排隊(稍後使用)並且不會解除分配一般爲

然而,這種行爲是不可預知的。如果您將代碼設置爲標準方式,那麼系統將管理單元。你不能100%確定一個單元何時被釋放。如果你的用戶可以從NSOutlineView刪除單元格,那麼單元被釋放的機會就會增加。

CNC中

基於下面的評論,你需要他們出列後,細胞復位。假設你的代碼看起來像這樣。

- (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 =藍色圖像,其他任何=圖像。如果我沒有重置細胞,當我崩潰的時候,一些細胞會因爲它們被重用而具有其他細胞的舊值。

+0

我看到...很酷,謝謝你的信息。後續問題...我如何取消分配已經崩潰的細胞? :) –

+0

我在我的應用程序中有一個奇怪的錯誤,我想我有它,因爲我在每次崩潰/展開操作之後將cellViews堆疊在彼此之上...所以我想要釋放單元格以查看如果它修復了問題 –

+0

「怪異的bug」不是非常具有描述性。我猜是因爲你的cellView正在被重用,你從一箇舊的單元格獲得數據顯示在其他單元格上? –

相關問題