将 NSTableView 绑定到两个不同数据源的最佳方法?
Posted
技术标签:
【中文标题】将 NSTableView 绑定到两个不同数据源的最佳方法?【英文标题】:Best way to bind a NSTableView to two different datasources? 【发布时间】:2015-04-17 09:25:10 【问题描述】:假设我有一个 NSTableView,它当前正在使用一个 NSArrayController,它从 Core Data 中提取数据。从两种不同的数据源流行表格视图的最佳方式是什么,一种是本地核心数据,另一种是远程 Web 服务调用。
我想要实现的是 Spotlight 样式的结果表,当用户键入时,它将显示来自核心数据的即时本地匹配和来自远程 Web 服务调用的远程匹配。
我是 Cocoa 的新手并且来自 ios 背景,所以 NSArrayControllers 对我来说是新的。
子类化 NSArrayController 是否可行,我能否以某种方式实现这一点,或者是否有一种更传统的方法,仅使用 NSTableView.datasource 协议并将它们全部粘合到视图控制器中。
【问题讨论】:
【参考方案1】:NSArrayController
只是一个方便的控制器,它观察一些数组的变化并更新 UI(反之亦然)。您真正要问的是“如何创建从核心数据存储以及外部源检索的匹配组合数组?”。这么一说,解决办法就比较明显了。
虽然对于简单的情况很方便,但一旦您走出“简单”,直接连接到获取请求的NSArrayController
就相当愚蠢。现在让我们忽略数组控制器,因为这实际上是两个独立的问题(管理从两个不同的源构建的集合,以及使用数组控制器与您自己管理的数组或集合与表数据源)。
假设您在某个控制器上有一个名为results
的属性,即NSMutableArray
。要构建您的结果,您将结合以下两个操作:1) 自己创建和执行 NSFetchRequest
,以及 2) 创建和执行一些网络操作。我不会详细介绍这两个操作中的任何一个,因为有很多关于这些方法的有价值的信息来源,但它真的很简单,因为它们可以在您的@987654326 中获得@数组。
至于数组控制器(如果这是您想要的方式),它所做的只是提供一种简单的方法来使用 Cocoa 绑定通过控制器(本身)将您的 UI 绑定到您的模型(results
数组) .就是这样。它有两种模式:通过针对托管对象上下文(即“核心数据”模式”)。由于您的意思是自己管理集合,因此“核心数据模式”对您不起作用。您希望将其配置为管理可变数组,并且根本不使用实体/MOC/获取请求(因为您将自己管理该位)。诀窍是避免“更改数组控制器背后的数组”,并确保您通过数组控制器的方法在数组中添加和删除对象,以便它知道数组的内容已更改并且可以相应地更新/排序/等。
但是,正如您所怀疑的,您也可以完全跳过阵列控制器而只使用NSTableViewDataSource
协议。这种方法不仅没有任何问题,而且在处理像您这样的自定义案例时,它实际上在许多方面都更胜一筹。当然,您必须管理选择更改(通过NSTableViewDelegate
协议)以及维护排序,但是当您考虑对您的收藏获得的控制级别时,这些都是相当琐碎的事情。您甚至可以轻松管理集合中的“组标题”标记,并使用适当的委托方法使用漂亮的浮动标题行将表中的“本地”与“远程”分开。
我希望这会有所帮助。
【讨论】:
很好的回复,我基本上得出了相同的结论。我只是想知道是否有更可可的方式来做到这一点。我只是走 NSTableViewDataSource 的路线,将两个 NSArray 组合成单个数据集。我会做我自己的 NSFetchRequests 而不是使用任何 NSArrayController。我不再使用绑定,但我认为它会更容易。 它比 Bindings 更像 Cocoa,因为多年来它是唯一的方法。 ;-) 来自 iOS 世界很棘手,因为 Cocoa 中似乎有很多遗留问题,这一直在欺骗我。永远不确定最佳实践是什么。 完全明白。 :-) 并不是要刻薄;多年来,我一直在敲打“数据源/委托方法仍然完全有效”的鼓。将与 Bindings 相关的控制器视为特例(“使用它是否足够简单?”)而不是默认解决方案。大多数长期的 Cocoa 开发人员甚至都不理会它们。 你一点也不刻薄。以这种方式考虑绑定很有用。由于我是 Bindings 的新手,我试图用它们解决所有问题,并意识到它们只能解决简单的问题。以上是关于将 NSTableView 绑定到两个不同数据源的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
NSTableView 绑定和 tableViewSelectionDidChange
将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果
NSTableView 和 NSOutlineView 拖放