2013-11-26 3 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. Один из них основан на представлении (более гибкий для использования), а другой - на основе ячеек. Предполагая, что youre использует основанную на представлении, NSTableCellViews в виде схемы не будет освобожден, когда вы свернете элемент. Ячейки просто выходят из очереди, то есть удаляются с экрана, который будет использоваться позже.

Это сделано для соображений эффективности использования памяти. Логика: «зачем выделять let say 2000+ cellViews, если экран способен отображать только 20 за раз?» Таким образом, ячейки получат очереди (будут использоваться позже) и не будут освобождены обычно.

ОДНАКО, это поведение непредсказуемо. Если вы настроите свой код стандартным образом, система будет управлять ячейками. Вы не можете быть на 100% уверены, когда ячейка будет освобождена. Если ваши пользователи могут удалять ячейки из NSOutlineView, тогда увеличивается вероятность освобождения ячеек.

-Edit-

Основываясь на комментариях ниже, вам нужно сбросить клетки после того, как их извлечение из. Предполагая, что ваш код выглядит примерно так.

- (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

«странная ошибка» не очень описательна. Я предполагаю, что, поскольку ваши cellViews повторно используются, вы получаете данные из старой ячейки, отображающейся на других ячейках? –