Objective c 如何从NSTableView中删除所有NSTableColumns?

Objective c 如何从NSTableView中删除所有NSTableColumns?,objective-c,cocoa,nstableview,Objective C,Cocoa,Nstableview,我正在尝试实现一种方法来清除所有项和列的NSTableView。但当我尝试实现以下内容时,我遇到了崩溃: - (void)clearResultData { [resultArray removeAllObjects]; NSArray *tableCols = [resultTableView tableColumns]; if ([tableCols count] > 0) { id object; NSEnumerato

我正在尝试实现一种方法来清除所有项和列的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];
}

如果有任何帮助,您可以删除所有列,如下所示:

- (void)removeAllColumns
{
    while([[tableView tableColumns] count] > 0) {
        [tableView removeTableColumn:[[tableView tableColumns] lastObject]];
    }
}

tableColumns
返回的NSArray由
removeTableColumn
更改。不要假设它是不变的

尽管它是作为不可变的NSArray返回的,但底层实现正在被修改,因此将NSEnumerator用于已修改的集合是不安全的。在while循环中,您正在向其当前对象刚刚被删除的枚举器发送nextObject消息,因此可能会发生不好的事情

下面是一个更高效的实现:

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

当表视图中没有列时:tableColumns返回空数组,空数组上的lastObject返回nil,col被赋值为nil,条件为false,while循环结束。

下面是一个快速实现:

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

控制台中是否有崩溃消息?