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