注意:安德鲁的回应让我再看一眼。此功能深埋在内部计时器中的大型应用程序中。如果该计时器关闭,我会得到错误的行为。如果计时器 on ,事情按预期工作。我不知道为什么那个计时器与这个表视图交互,但正如我所说,它是一个庞大而复杂的应用程序。
我希望用户能够选择要显示的列。他将看到一组单选按钮或复选框,一个用于显示对象中的每个键。他可以选中或取消选中一个框,NSTableView将添加或删除该密钥的列。
显示的对象是NSDictionary。直到运行时才知道字典的键,所以我必须在运行时创建带有标识符的列......它们在编译时是未知的。
实施添加功能顺利进行。我创建一个列和一个标题单元格,将标题单元格的文本设置为某个值。但删除并不那么容易。 [myTableView removeTableColumn:col]
删除列,但不会很好地处理标题。有时标题文本不会被删除。有时会删除两列中的标题文本。有时我最终会将两个标题文本字符串打印在彼此之上。
显然我错过了一些东西。如何以编程方式删除列及其标题?
答案 0 :(得分:1)
通过从复选框选择器调用这两个方法可以轻松实现。
要动态添加列,您应该调用它:
- (void)addColumnWithCheckboxToTable:(NSTableView *)table :(NSString *)header
{
NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:header];
[[column headerCell] setStringValue:header];
// Add column to table
[table addTableColumn:column];
}
要删除列调用这个:
- (void)removeColumnWithCheckboxFromTable:(NSTableView *)table :(NSString *)header
{
NSTableColumn *column = [table.tableColumns objectAtIndex:[table columnWithIdentifier:header]];
[table removeTableColumn: column];
}
答案 1 :(得分:1)
我对这个帖子有点迟,但我最近遇到了一个非常类似的情况。
事实证明,在我修改主线程中的NSTable结构的情况下,一切都很好。有时虽然修改发生在另一个线程上,这导致了上述问题。
像往常一样,修改UI的所有代码都应该在主线程上,因此修复相对简单:让所有代码在主线程上运行。