2013-02-23 1 views
2

У меня есть мнение на основе NSTableView, который использует вид NSViewController подклассов (InspectorViewController):NSViewController вид не выпущен, когда используется в представлении на основе NSTableView

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    // Get inspector view controller 
    InspectorViewController *inspectorViewController = [_inspectorViewControllers objectAtIndex:row]; 

    // Return its view 
    return inspectorViewController.view; 
} 

Все в порядке, за исключением, что вид NSViewController никогда не освобождается когда я удаляю контроллер представления (который хорошо выпущен).

Если я использую этот код вместо:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    // Get inspector view controller 
    InspectorViewController *inspectorViewController = [_inspectorViewControllers objectAtIndex:row]; 

    // Return its view 
    NSTableCellView *view = [[NSTableCellView alloc] init] autorelease]; 
    [view addSubview:inspectorViewController.view]; 
    return view; 
} 

мнение правильно освобожден, когда я удалить контроллер представления. Вот код для удаления контроллера вида:

- (void)inspectorViewControllerClosed:(InspectorViewController *)inspectorViewController { 
    // Get index of inspector view controller 
    NSUInteger index = [_inspectorViewControllers indexOfObject:inspectorViewController]; 

    // Remove inspector view controller in array 
    [_inspectorViewControllers removeObject:inspectorViewController]; 

    // Create index set 
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:index]; 

    // Begin updates 
    [_tableView beginUpdates]; 

    // Move row in table view 
    [_tableView removeRowsAtIndexes:indexSet withAnimation:NSTableViewAnimationEffectFade]; 

    // End updates 
    [_tableView endUpdates]; 
} 

я попытался воспроизвести проблему с помощью небольшого образца кода и у меня та же проблема, вид представления контроллера выпущена только когда я не вернусь непосредственно вид контроллера просмотра.

Кто-нибудь может мне помочь?

ответ

1

Найдено, NSTableView сохраняет вид для многократного использования, он правильно освобожден с этим кодом:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    // Get inspector view controller 
    InspectorViewController *inspectorViewController = [_inspectorViewControllers objectAtIndex:row]; 

    // Disable reusing ? 
    [_inspectorViewController.view setIdentifier:nil]; 

    // Return its view 
    return inspectorViewController.view; 
} 
0

Вы могли бы использовать:

[inspectorViewController.view removeFromSuperview] 

перед удалением контроллера представления.

+0

Почему? Это не делается автоматически с помощью NSTableView removeRowsAtIndexes: withAnimation :? Когда я использую решение, которое работает (показывая вид контроллера представления в другом представлении), все в порядке, без необходимости вызова removeFromSuperview – Johnmph

+0

Это возможно потому, что вы автоматически сохраняете родительское представление, и дочерний вид будет выпущен в процессе. Я не знаю, делает ли это 'removeRowsAtIndexes: withAnimation'? Вы попробовали? – Rakesh

+0

tableView: viewForTableColumn: строка: запрашивает автореализованный вид, поэтому во втором примере я автореализовал родительский вид. Когда я возвращаю inspectorViewController.view, я не сохраняю его, поэтому он должен быть выпущен, когда диспетчер представлений выпущен (потому что он сохраняет его), и когда представление удаляется из представления таблицы (выполняется с помощью removeRowsAtIndexes: withAnimation или reloadData). – Johnmph

Смежные вопросы