2011-12-22 49 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循环结束。