У меня есть мнение на основе 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];
}
я попытался воспроизвести проблему с помощью небольшого образца кода и у меня та же проблема, вид представления контроллера выпущена только когда я не вернусь непосредственно вид контроллера просмотра.
Кто-нибудь может мне помочь?
Почему? Это не делается автоматически с помощью NSTableView removeRowsAtIndexes: withAnimation :? Когда я использую решение, которое работает (показывая вид контроллера представления в другом представлении), все в порядке, без необходимости вызова removeFromSuperview – Johnmph
Это возможно потому, что вы автоматически сохраняете родительское представление, и дочерний вид будет выпущен в процессе. Я не знаю, делает ли это 'removeRowsAtIndexes: withAnimation'? Вы попробовали? – Rakesh
tableView: viewForTableColumn: строка: запрашивает автореализованный вид, поэтому во втором примере я автореализовал родительский вид. Когда я возвращаю inspectorViewController.view, я не сохраняю его, поэтому он должен быть выпущен, когда диспетчер представлений выпущен (потому что он сохраняет его), и когда представление удаляется из представления таблицы (выполняется с помощью removeRowsAtIndexes: withAnimation или reloadData). – Johnmph