将 NSTableView 绑定到 Swift 中的字符串数组

Binding an NSTableView to an array of strings in Swift

我正在通过数组控制器通过绑定显示带有 NSTableView 的字符串数组的内容。

我在数组控制器的属性检查器和数组控制器的绑定检查器的模型键路径中的 Class 名称中有 "NSString" 我有我的数组的路径。我将 table 的唯一列在其值部分绑定到数组控制器,但未指定模型键路径(它只是一个字符串数组)。

因此,数组的字符串在 table 中显示良好。但我无法编辑任何行:

2015-06-17 15:48:44.285 ProjectName[9043:123132] An uncaught exception was raised
2015-06-17 15:48:44.285 ProjectName[9043:123132] Error setting value for key path  of object five (from bound object <NSTableColumn: 0x618000082d50>    identifier: (null)): [<Swift._NSContiguousString 0x608000045d60> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key .

"five" 是我试图编辑的数组中的第五个字符串。如您所见,"path of" 中存在间隙,因为列值的模型键路径为空。

那么我是否以某种方式在模型键路径中引用字符串本身以通过 table 创建数组 editable?

Class 名称绝对应该设置为有效的 class。更大的问题是数组控制器不能很好地处理字符串数组。没有(合理的)方法可以在字符串上使用 -setValue:forKey:,因为字符串本身就是正在编辑(替换)的内容,而不是某些 属性(如“displayName”)。

我知道这看起来很浪费,但如果你真的必须使用数组控制器(稍后会详细介绍),你应该只创建一个带有字符串 属性 的 class 并设置 that 作为控制器的 class 名称并维护一个数组 class 而不是纯字符串。假设您的字符串数组代表标签。使用类型为 String(或 NSString)的 name 属性 创建 Tag class。将控制器的 class 名称设置为 Tag。这样,就有了一个要绑定的关键路径。

但是,如果您真的认为自己除了字符串数组之外不需要任何东西,您可以只使用标准(并且无限灵活)[NSTableViewDataSource][1] 协议和由按钮触发的老式操作(如添加和删除)。这样你就不会与 Cocoa Bindings / KVC / KVO 机制作斗争,因为在这种情况下,对于一个非常抽象的控制器来说,类型(字符串)太原始了。

至于工作量,几乎 "six of one half-dozen of the other" 但不完全是 -- 我会选择 "make it a class with a name property" 路线,原因有二:1) 它比旋转整个 "make it a class with a name property" 的工作量少=40=] 控制器/数据源,以及 2) 以后您可能希望有一个更可扩展的 class 而不是 "list of stuff" 的简单字符串,即使您现在不这么认为.