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