tableCellView 内的 NSButton:如何对基于视图的 NSTableView/NSArrayController 使用“动作调用”

Posted

技术标签:

【中文标题】tableCellView 内的 NSButton:如何对基于视图的 NSTableView/NSArrayController 使用“动作调用”【英文标题】:NSButton inside tableCellView: how to use the "action invocation" for a View Based NSTableView/NSArrayController 【发布时间】:2012-11-25 17:25:35 【问题描述】:

对于基于视图的 NSTableView/NSarrayController:如何使用来自 tableCellView 内的 NSButton 的“动作调用”来更改实体的属性?

我有以下设置:

具有一列的“基于视图”的 NSTableview。 使用“实体模式”并绑定到核心数据实体的 NSarrayController。

我想使用按钮的动作调用来更新实体。例如将“bool”属性设置为 true。

如果我只是使用“模型键路径”并将其设置为 objectValue.escaped,则该按钮将被禁用。

【问题讨论】:

或者我应该使用“sent action”吗?或者忘记 nsarraycontrol 并使用数据源? 如果我对委托使用“发送操作”(例如“petEscaped:”),我只会得到发件人 ID(按钮))。由于未选择该行(不是很奇怪)我没有机会找到和访问实体。 我为我的问题找到的最佳 SDK 示例是 TableViewPlayground,其中使用了 OutlineView 中的按钮。令我惊恐的是,这个例子中使用了一个带有 data-source 绑定的“自制”控件。这将导致大约 1000 行额外代码仅用于 UI 处理(从演示中聚合)和另一个用于 core-data 处理的控件类。 我使用带有 IBAction 的 tableView 委托来处理按钮和 rowForView:itemAtRow: 来读取行数据。 (就像在 TableViewPlayground 示例中一样) 【参考方案1】:

我能够通过在按钮本身(NSTableCellView 中的视图类)上设置一个操作,然后将 NSTableView 的委托设置为实现选择器的类来实现这一点。然后它会按预期工作。

【讨论】:

【参考方案2】:

澄清我的问题:

如果我的数据源有另一个客户端,例如通过 Web 服务连接,并且我想触发一个事件。我会使用实体属性来通知客户。因此,我在 tableCellView 中添加了一个按钮。

我从连接到核心数据实体的 NSTableView 和 NSArrayController 作为对象控制器开始。文本字段、图像、复选框和弹出按钮在绑定到控件后立即起作用。但是我没有找到绑定“按钮”的可行解决方案。(我尝试将控件、表格、单元格视图和按钮子类化,但没有成功。)

最后我切换到动作/委托方法。使用 rowForView:itemAtRow:representObject: 方法可以修改实体的属性。

我对这种不雅的解决方案(outlineView/分离代码)不满意。如果 arrayControl 有解决方案,请告诉我。

【讨论】:

以上是关于tableCellView 内的 NSButton:如何对基于视图的 NSTableView/NSArrayController 使用“动作调用”的主要内容,如果未能解决你的问题,请参考以下文章

无法在 TableCellView 中初始化 UIImage

带有自定义 xib 的 TableCellView 未加载

NSButton 值为 1

如何确定 NSButton 是不是为复选框?

Cocoa:当它在NSButton上时更改光标

旋转 NSButton 不起作用