问题标签 [key-value-coding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
12658 浏览

iphone - 关于 Objective-C/Cocoa Key-Value 编码和数组

我正在尝试找出“正确”的方法来处理使用 iPhone 应用程序的键值编码填充数组。我想出了一些可行的方法,但它相当hackish。基本上,我将 XML 文档解析为一组代码生成的模型。让我们假设 XML 是这种格式:

在我生成的代表 Bar 元素的对象上,我为子节点定义了一个 NSMutableArray:

因此,默认情况下,当我在 Bar 的实例上调用 setValue:forKey: 时,它最终会用 Item 对象的单个实例覆盖 NSMutableArray 的实例。我目前为使其正常工作所做的工作是它变得很糟糕的地方。我将数组实例变量重命名为别的东西,让我们说名称的复数形式:

这会导致 setValue:forKey: 的默认访问器丢失。然后我将此方法添加到 Bar 实现中:

一切正常!我相信一定有更好的方法来做到这一点!我已经通读了 Key-Value Coding Programming Guide,但我一定遗漏了一些东西,因为我不清楚数组访问器应该如何工作。我已经尝试实现 countOf: 和 objectInAtIndex: 他们 KVC 编程指南似乎表明,但这仍然会导致我的 NSMutableArray 被 Item 类型的实例覆盖。

0 投票
4 回答
5669 浏览

cocoa - Interface Builder > Inspector > Bindings 中的“Controller Key”是什么意思?

我在文档中找不到他们解释所有这些字段及其含义的地方。特别是“控制器密钥”我不清楚。

0 投票
1 回答
1185 浏览

core-data - KVC compliance for numbers in NSManagedObject subclass (CoreData)

I'm trying a basic test of sorting an NSManagedObject subclass. I set up a basic subclass "TestClass" with two attributes: stringField and numberField. They use the standard Obj-C 2.0 accessor protocol:

When I try to fetch instances of this entity, I can fetch based on either attribute. However, if I use a sort descriptor, the numberField is said to not be KVC-compliant.

Within the model, I set the numberField to Int64, but I'm confused. I thought the wrapper (NSNumber) would handle the KVC problem. What do I need to do to make this work?

0 投票
1 回答
2088 浏览

cocoa - Cocoa 绑定到数组控制器中的特定项目

是否可以使用NSArrayController将 aNSTextField的值绑定到数组中的特定项目?特别是,我想绑定到数组中第一项的属性,如果数组为空,则不显示任何内容。

使用arrangedObjects.command仅显示“(” - 大概它试图为每个项目显示一个带有逗号分隔字符串的多行字符串。我只想要第一个。

0 投票
2 回答
624 浏览

objective-c - 限制 NSArrayController 中的对象数量

我正在尝试在我的应用程序中创建某种“前 25 名”列表。我使用 NSPredicate 过滤数组控制器的内容,但我想将结果的数量限制为 25 个对象。我怎么能那样做?

0 投票
4 回答
4851 浏览

objective-c - 如何将对象添加到以编程方式绑定的 NSMutableArray?

我有一个具有以下结构的 NSDocument:

我在 MyDocument.xib 中实例化了 NSArrayController 和 MyView,并与文件的所有者 (MyDocument) 建立了连接,所以我很确定从 Interface Builder 的角度来看,我已经正确地完成了所有操作。

MyView 的界面很简单:

现在,在 中MyDocument windowControllerDidLoadNib,我有以下代码:

在调试器中,我已经验证了它myViewArray是一个 NSControllerArrayProxy,所以看起来我的编程绑定是正确的。但是,当我尝试将 MyView 方法中的对象添加到 MyViewmyViewArray时,它们似乎不会更新 MyDocument 的myArray. 我尝试了以下两种方法:

(正如预期的那样,第二种方法会导致编译器错误,但我认为根据我对 KVO 的有限理解,Objective-C 运行时会“实现”此方法。)

我尝试更新的方式有问题myViewArray吗?我的编程绑定有问题吗?(我正在尝试以编程方式执行此操作,因为 MyView 是自定义视图,我不想为其创建 IB 调色板。)

0 投票
1 回答
1176 浏览

iphone - 在 Interface Builder 中设置 Nib Name 字段时出现异常

我正在尝试从 Interface Builder 中的 nib 加载视图控制器。我的基本设置是这样的:

MainWindow.xib 包含:所有常用的东西,应用程序委托实例,窗口等。

一个 UINavigationController,它有一个 UIViewController 作为它的根视图控制器。UIViewController 的 nib 名称设置为包含我的视图控制器的 xib 的名称。

我单独的 xib 中的视图控制器将文件所有者的类型设置为该视图的控制器类。

每当视图加载时(即应用程序启动时),就会引发异常,说明我的控制器类不符合键的键值编码[在此处插入随机变量名称]。大多数情况下,键是我为按钮指定的名称或我设置为 IBOutlet 的其他名称。

为什么会这样?我错过了什么?我尝试为这些变量中的每一个创建属性以生成符合 KVC 的访问器,但它仍然抛出异常。

任何帮助都会很棒,谢谢!

0 投票
1 回答
177 浏览

cocoa - 是否可以有一个结合了多个关键路径的绑定?

假设我有一个具有数量值的对象。

另外,我有一个数组控制器,其中包含这些对象的数组。

此外,我有一个表,它具有总列的百分比(即给定行的数量占所有行数量总和的百分比),需要通过绑定填充适当的值。

然后看起来这样做的想法是将此列绑定到 arrayController.arrangedObjects.@sum.quantity 除以 arrayController.arrangedObjects.quantity。

是否有可能做到这一点?

如果没有,您能否提出实现同样目的的替代方法?

0 投票
1 回答
793 浏览

cocoa - 应该将“对多”关系建模为属性吗?

在阅读了Key-Value Coding Programming GuideKey-Value Observing Programming GuideModel Object Implementation Guide,以及阅读了很多关于该主题的 StackOverflow 条目并尝试了各种建模场景之后,我感觉我对如何为我的数据建模。

我最终为我的所有属性和一对一关系使用声明的属性,由私有 ivars 支持。对于需要私有可写的只读属性,我readonly在接口声明中使用该属性,然后在文件中声明的类扩展中使用该属性.h重新声明该属性。在类方法中,我总是使用带点语法的属性访问器,从不直接访问私有 ivars。readwrite.m

然而,有一个方面仍然让我感到困惑:如何正确建模多对关系,特别是当集合是公开不可变但私有可变时(即模型对象的消费者不能向集合添加或删除对象,但是集合的内容由类私下管理)。

我确实了解如何为一对多关系( , 等)实现 KVC 访问器方法,countOf<Key>objectsIn<Key>AtIndex是我迄今为止一直遵循的路线。

但是,我已经看到一些示例代码使用声明的属性来公开关系,不实现 KVC 访问器方法,但仍然是 Key-Value 可观察的。例如:

MyModel如果消费者对象将自己添加为关键路径实例的观察者"transactions",那么每当从集合中添加或删除事务时都会通知它transactions(只要通过该mutableArrayValueForKey:方法完成突变)。

对我来说,这似乎是向许多关系公开的最干净的方式,因为我不需要手动编码集合 KVC 访问器并且它保持代码干净。

但是,这似乎不是 Apple 文档所提倡的方式,我不禁想知道它的工作原理是否只是一个不可靠的副作用。

因此,在为我开始从事的项目在我的真实模型类中使用一种或另一种技术之前,我想获得经验丰富的 Cocoa 开发人员的意见和建议。

所以问题是:如果我使用属性来建模一对多关系,我还需要实现 KVC 访问器/修改器方法吗?

更新

即使我将一个多对多属性声明为readonly,就像上面的示例一样,外部代码仍然可以调用mutableArrayValueForKey:@"transactions"模型对象并改变集合。这似乎表明对多对关系使用声明的属性不是要走的路,但我仍然觉得我不太明白......

0 投票
2 回答
886 浏览

cocoa - 根据 NSTextFieldCell 的编辑值更新绑定字典

我正在将一些古老的代码(10.2 时代)从基于 NSCoding/plist 的归档移植到使用 Core Data。我有一个带有自定义 NSTextFieldCell 的 NSOutlineView。大纲视图绑定到 NSTreeController 以提供数据。

绑定模型如下所示:

NSTreeController: 托管对象上下文 -> Controller.managedObjectContext

NSOutlineView 的 NSTableColumn 值 -> Tree Controller:arrangedObjects:itemDictionary

NSOutlineView 有一个自定义的 NSTextFieldCell 子类,它在文本字段旁边添加一个图像,所以我将 NSManagedObject 的值作为一个名为 itemDictionary 的 NSMutableDictionary 传递给它,这样我就可以拉取并设置标题和 isChecked 键值。

我遇到的问题是更新文本字段的值并将更改后的值传递回我的托管对象实例。用户双击标题值并对其进行编辑后,它被传递给-(id)objectValue,但我不确定下一步是将更新传播到我的 NSManagedObject 实例。到目前为止,我在 NSTextFieldCell 子类中读取和设置值的代码如下: