Cocoa 绑定(bind)和自定义 NSCell 属性

标签 cocoa cocoa-bindings nsarraycontroller nscell ibplugin

我有一个关于子类 NSCell(复选框单元)的问题。我希望它们在复选标记旁边有一个标题和一个副标题(所以我为它们创建了 NSString 属性)。它们的值应通过绑定(bind)设置(来自 IB 会很棒),但问题来了:

IB 只允许我设置单元格的“值”,在我的例子中为复选标记状态的 BOOL。

哪个类必须绑定(bind)到提供数据的 NSArrayController? 似乎细胞本身不能与任何东西绑定(bind)并做类似的事情

[self.subtitle bind:...]

也不起作用。我必须在何时何地进行绑定(bind)?

最好,斯特凡

最佳答案

我假设您在基于单元格的 NSTableView 中执行此操作,因为 NSButtonCell 确实公开了 title 绑定(bind),但它在 NSTableView 的上下文中毫无用处,因为您有绑定(bind) NSTableColumn,并且仅公开包含 NSButtonCells 的 NSTableColumn 的值绑定(bind)。这是该框架的一个缺点,谷歌透露,许多人都在努力解决这个缺点。

一种方法是在 -tableView:dataCellForTableColumn:row:-tableView:willDisplayCell:forTableColumn:row: 委托(delegate)方法中更新模型中的标题。这样做的缺点是当底层模型发生变化时,无法通过 KVO 进行更新。如果这对您的应用程序很重要,一种解决方法是使复选框的 value 的模型 keyPath 依赖于复选框的 title 的模型 keyPath。这样,当标题更改时,KVO 将发送值更改的通知,这将导致重新绘制行,从而通过委托(delegate)方法更新标题。

我注意到这个问题已经很老了,但是现在更简单的方法是使用基于 NSView 的 NSTableViews。完成此操作后,您将使用一流的 NSButton 控件,并且可以使用 Value 和 Title 绑定(bind)(以及许多其他绑定(bind))。假设您不担心支持 Lion 之前的操作系统版本,这通常是一种更可行的方法。

关于Cocoa 绑定(bind)和自定义 NSCell 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5461576/

相关文章:

objective-c - 如何通过 NSArrayController 获得模型更改的通知?

objective-c - 选定的菜单项颜色未对齐?

Xcode 7 内存泄漏

macos - 有没有办法在 Swift 中以编程方式设置 NSCollectionView?

objective-c - 绑定(bind)未更新。看不出出了什么问题

cocoa - 将数组 Controller 初始化从 nib 移动到代码会破坏 TableView 绑定(bind)

cocoa - 添加到多/多对多核心数据关系

iphone - 关于使用 Accelerate.framework 的问题

swift - 如何在 mac os x 应用程序中通过 shell 命令访问文件?

cocoa - 从 OSX lion 上的版本浏览器恢复不起作用...有什么想法吗?