在 NSWindow 手动调整大小之前,NSTableView 不会布局/调整列大小

Posted

技术标签:

【中文标题】在 NSWindow 手动调整大小之前,NSTableView 不会布局/调整列大小【英文标题】:NSTableView won't layout / resize columns until NSWindow manually resized 【发布时间】:2014-01-02 19:41:22 【问题描述】:

我有一个带有几个 NSTableColumn 对象的 NSTableView,这些对象似乎设置了所有正确的自动调整大小标志。但是,每次我重建表格的内容时,所有列都会恢复到一个狭窄的大小——除非我单击并手动调整窗口大小。

NSTableView 在里面:

NSWindow NSView NSScrollView NSTableView (其他 NSTableView 对象:NSTableColumn、NSTextFieldCell、NSScroller (x 2)

列大小调整掩码始终为:

NSTableColumnAutoresizingMask
NSTableColumnUserResizingMask

创建表时始终设置为:

[theNSTableView setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle];

用数据重新加载表格后,

[theNSTableView reloadData];
[theNSTableView tile];

...甚至:

[theNSTableView setNeedsDisplay:YES];

所有视图都设置为“autoresizesSubviews”。

NSView 和 NSScrollView 都没有任何引用出口——这可能是问题吗?

【问题讨论】:

你调用什么来重新加载表格的内容?什么时候重新加载?您是否在运行时更改过列? @WilShipley -- 在有重大变化的不同时间,我会检查并删除列,然后重新添加它们。对 reloadData 的调用确实会正确填充表。自发帖以来,我从 Apple DTS 中发现了一些关于这个问题的信息,我将在下面详细介绍。 【参考方案1】:

在与 Apple 开发者技术支持详细讨论了这个问题后,他们认为 Carbon-Cocoa 集成可能存在问题。

但是,他们也指出我真的不应该设置 NSTableViewUniformColumnAutoresizingStyle 并且我应该在我自己的代码中计算我所有列的宽度,然后要么告诉列记住它的宽度,要么存储宽度并确保在我以编程方式创建列之后,在每列上设置相同的宽度。

虽然我可以接受这一点,但我至少希望能够以编程方式调用当用户双击列分隔符并且列调整自身大小以适应其所有单元格文本内容时调用的相同方法。但是,DTS 告诉我这些功能不可用。

我在 SO 上遇到了这个问题的其他解决方案,我会看看它们是否可以适应创建最佳解决方案。

【讨论】:

以上是关于在 NSWindow 手动调整大小之前,NSTableView 不会布局/调整列大小的主要内容,如果未能解决你的问题,请参考以下文章

为啥添加约束会消除调整 NSWindow 大小的能力?

NSWindow - 调整大小时缩放所有内容

为啥设置约束后不能再调整 NSWindow 的大小?

我的 JComponent 的内容仅在手动调整大小后刷新

无法编辑 NSWindow 的工具栏 - Cocoa

双击透明 NSWindow 标题不会最大化窗口