2011-12-22 52 views
4

我想實現一個方法來清除所有項目和列的NSTableView。但是,我得到一個崩潰當我嘗試執行以下操作:如何從NSTableView中刪除所有NSTableColumns?

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

崩潰是否在控制檯中顯示一條消息? – 2011-12-22 18:56:48

回答

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的返回由tableColumnsremoveTableColumn改變。不要以爲它沒有改變。

儘管它是作爲非可變的NSArray返回的,但底層實現正在被修改,並且使用NSEnumerator和修改後的集合並不安全。在while循環中,您將發送nextObject消息給當前對象剛剛被刪除的枚舉器 - 這樣可能會發生不好的事情!

這裏的一個更有效的實現:

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

當有在表視圖沒有列:TableColumn來返回一個空數組,lastObject空數組上返回nil,列被分配零的值,則條件是錯誤的,while循環結束。