我正在做自己的本地化,在加载窗口/视图后预先解析所有窗口控件,并翻译所有特殊标记的值、工具提示等。
但是,如果我为表格单元格视图预设工具提示,我将无法弄清楚如何从 NSTableView 对象访问它。
这是 Xcode 的 IB 中的单元格视图:
以及单元格视图的工具提示属性:
当我只有对其 TableView 对象的引用时,如何以原型形式获取该 TableCellView,以便我可以更改稍后添加的所有行的工具提示?
一定有办法,因为当使用aNSArrayController
来管理表视图行时,TableView如何知道如何添加行,而我的代码根本没有显式引用这些原型,这意味着必须NSArrayController
有办法找到这些细胞原型——我也想实现同样的目标。
我知道我可以在加载视图的代码中添加来自标头视图的绑定,但我正在尝试编写一个通用方法,该方法仅给出根表视图并查找其中的所有工具提示。
我相信 AppKit API 不可能做到这一点。
这就是我得出这个结论的原因,这样万一我错了(或者即使我是对的),推理仍然有价值:
您请求更改“行(单元格)原型”不可能的原因
每个新单元都是直接从 Nib 创建的
弱信号:检查 awakeFromNib 的使用情况
对于正在创建的每个
NSTableViewRow
和,都会收到一条消息。所有者通常是您的表视图控制器——或者 Nib 文件的所有者。(为了简单起见,我假设您有一个用于同名视图控制器的 Nib,该 Nib 在容器中包含一个表视图。)NSTableViewCell
owner
-awakeFromNib:
MyTableViewController.xib
这是一个强烈的迹象(也是错误的原因:)),您创建的每个单元格(不是重复使用的)都是从 Nib 创建的。
强信号:您可以看到(并更改)Nib-to-Cell 关联
这在文献中也有讨论。不过,如果您想在单独的 nib 中设计单元格,则类似的约束也适用于 AppKit Nibs:
我发现这种心态很有帮助:无论出于何种意图和目的,主视图控制器 Nib 都将被视为未来单元格的 Nib。
NSUserInterfaceItemIdentifier
如果您查看注册的 Nib,则可以通过以下方式访问它:对于 AppKit,我们NSTableView.registeredNibsByIdentifier
必须检查并NSTableView.register(_:forIdentifier:)
更改每个单元格的 Nib 关联。因此,如果您想调整某些内容,最好的选择是覆盖那里的笔尖关联。
无法对 Nib 内部进行编程写入访问
Nib 是不透明的数据 blob,没有公共表面 API。
NSNib
没有 API 来修改其任何对象。解决更改默认值的根本问题的实际方法
以编程方式影响从 Nib 恢复对象是可能的
您无法以编程方式设置正在加载的蓝图
NSNib
,但您可以挂钩该进程:因此,当您的
NSTableViewCell
实例化时,您可以替换工具提示。这意味着您需要
NSNib
一个可能带有static var
工具提示的子类来存储下一个工具提示值;您不能使用 Nib 文件本身作为存储。使用 NSTableView 回调代替
像您这样的基于 NSView 的表视图的主要自定义点是
NSTableViewDelegate.tableView(_:viewFor:row:)
。这也适用于重复使用的单元格,因此无论单元格是在您想要修改工具提示的时间点之前还是之后新创建的,您都可能获得更一致的行为。由于您不能使用 Nib 本身作为工具提示数据存储,而是需要放置一个全局变量、视图控制器上的属性(与表视图的生命周期相关联)或
static var
类似的类型MyCustomNib: NSNib
,因此您不妨使用视图NSTableViewDelegate
在很多情况下,控制器属性和回调。