如何从NSTableView中删除所有NSTableColumns?

时间:2011-12-22 18:54:20

标签: objective-c cocoa nstableview

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

4 个答案:

答案 0 :(得分:16)

好吧,如果有任何帮助,你可以删除所有列:

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

答案 1 :(得分:4)

tableColumns返回的NSArray由removeTableColumn更改。不要以为它没有变化。

虽然它作为不可变的NSArray返回,但是底层实现正在被修改,并且将NSEnumerator与修改的集合一起使用是不安全的。在while循环中,您要向刚刚删除当前对象的枚举器发送nextObject消息 - 这样可能会发生不好的事情!

这是一个更有效的实施方式:

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

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

答案 2 :(得分:0)

[[[_tableView tableColumns] copy] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [_tableView removeTableColumn:obj];
}];

答案 3 :(得分:0)

这是一个Swift实现:

  - name: setting fact for service name
    set_fact:
      servicename: TCP-{{port}}
    when: >
          protocol == "TCP" or protocol == "tcp"

  - name: setting fact for service name
    set_fact:
      servicename: UDP-{{ port }}
    when: >
          protocol == "UDP" or protocol == "udp"

  - name: setting fact for service name
    set_fact:
      servicename: "ALL"
    when: >
          protocol == "all" or protocol == "ALL"

  - name: setting fact for service name
    set_fact:
      protocolname: "tcp_udp_sctp"
    when: >
          protocol == "TCP" or protocol == "tcp"

  - name: setting fact for service name
    set_fact:
      protocolname: "tcp_udp_sctp"
    when: >
          protocol == "UDP" or protocol == "udp"

  - name: setting fact for service name
    set_fact:
      protocolname: "ALL"
    when: >
          protocol == "all" or protocol == "ALL"