【问题标题】:Removing a column and its header from an NSTableView从 NSTableView 中删除列及其标题
【发布时间】:2013-12-16 23:47:52
【问题描述】:

注意:安德鲁的回答让我又看了看。此功能深埋在具有内部计时器的大型应用程序中。如果该计时器 off 我会得到此处描述的错误行为。如果计时器 on 一切正常。我不知道为什么那个计时器会与这个表格视图交互,但是,正如我所说,它是一个庞大而复杂的应用程序。

我希望用户能够选择要显示的列。他将看到一组单选按钮或复选框,显示对象中的每个键对应一个。他可以选中或取消选中一个框,NSTableView 将为该键添加或删除一列。

显示的对象是一个 NSDictionary。字典的键直到运行时才知道,所以我必须在运行时创建带有标识符的列......它们在编译时是未知的。

添加功能的实现很顺利。我创建了一个列和一个标题单元格,将标题单元格的文本设置为某个值。但删除并不是那么容易。 [myTableView removeTableColumn:col] 删除了列,但没有很好地处理标题。有时不会删除标题文本。有时会删除两列中的标题文本。有时我会得到两个相互叠加的标题文本字符串。

显然我错过了一些东西。如何以编程方式删除列及其标题?

【问题讨论】:

  • 删除列也应该可靠地删除标题及其文本。您能否发布更多代码,或者更好的是,提供一个暴露问题的示例项目?
  • 我有一个具有此功能的应用程序。基本上,您创建包含所有列的表。然后在运行时您可以更改列的可见性,因此您实际上不会添加或删除列......您只需使它们可见或不可见。

标签: objective-c cocoa header nstableview nstablecolumn


【解决方案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];
}

【讨论】:

    【解决方案2】:

    我对此线程有点晚了,但我最近遇到了非常相似的情况。

    事实证明,在我修改主线程中的 NSTable 结构的情况下,一切正常。有时虽然修改发生在另一个线程上,这导致了上述问题。

    像往常一样,所有修改 UI 的代码都应该在主线程上,因此修复相对简单:让所有代码在主线程上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多