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

时间:2015-06-17 12:56:51

标签: macos swift cocoa nstableview cocoa-bindings

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

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

结果,数组的字符串在表格中显示得很好。但我无法编辑任何行:

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 .

&#34; 5&#34;是我尝试编辑的数组中的第五个字符串。正如你所看到的,&#34;&#34;路径中存在差距。因为模型键路径对于列的值是空的。

那么我是否以某种方式在模型关键路径中引用字符串本身以通过表格使数组可编辑?

1 个答案:

答案 0 :(得分:1)

Class Name应该绝对设置为有效的类。更大的问题是阵列控制器并不能很好地与字符串数组一起使用。没有(合理的)方法在字符串上使用-setValue:forKey:因为字符串本身正在被编辑(替换),而不是某些属性(如“displayName”)。

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

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

关于工作量,它几乎是“其他六个中的六个”但不完全 - 我会选择“让它成为一个有名称属性的课程”路线,原因有两个:1)这比打开一个整个表控制器/数据源要少,2)你可能会希望你有一个更可扩展的类而不是一个简单的字符串来表示“东西列表”,即使你不这么认为现在