2011-12-22 3 views
4

Я пытаюсь реализовать метод очистки NSTableView всех элементов и столбцов. Но я получаю сбой при попытке реализовать следующее:Как удалить все NSTableColumns из NSTableView?

- (void)clearResultData 
{ 
    [resultArray removeAllObjects]; 
    NSArray *tableCols = [resultTableView tableColumns]; 
    if ([tableCols count] > 0) 
    { 
     id object; 
     NSEnumerator *e = [tableCols objectEnumerator]; 
     while (object = [e nextObject]) 
     { 
      NSTableColumn *col = (NSTableColumn*)object; 
      [resultTableView removeTableColumn:col]; 
     } 
    } 
    [resultTableView reloadData]; 
} 
+1

Неужели авария пришла с сообщением в консоли? –

ответ

14

Ну, если это любая помощь вы можете удалить все столбцы, как это:

- (void)removeAllColumns 
{ 
    while([[tableView tableColumns] count] > 0) { 
     [tableView removeTableColumn:[[tableView tableColumns] lastObject]]; 
    } 
} 
0
[[[_tableView tableColumns] copy] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    [_tableView removeTableColumn:obj]; 
}]; 
3

NSArray возвращаемые tableColumns изменяется на removeTableColumn. Не предполагайте, что он не изменился.

Хотя он возвращается как не изменяемый NSArray, базовая реализация изменяется и небезопасно использовать NSEnumerator с измененными наборами. В цикле while вы отправляете сообщение nextObject в счетчик, чей текущий объект был просто удален - так могут случиться плохие вещи!

Вот более эффективная реализация:

NSTableColumn* col; 
while ((col = [[tableView tableColumns] lastObject])) { 
    [tableView removeTableColumn:col]; 
} 

Когда нет столбцов в виде таблицы: tableColumns возвращает пустой массив, lastObject на пустой массив возвращает ноль, цв присваивается значение ноль, то условие ложно, и цикл while завершается.

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