问题标签 [key-value-observing]

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 回答
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 投票
6 回答
16644 浏览

objective-c - 如何在 Objective-C 中检测属性返回类型

我在运行时在objective-c中有一个对象,从中我只知道KVC键,我需要检测这个属性的返回值类型(例如我需要知道它是NSArray还是NSM​​utableArray),我该怎么做?

0 投票
4 回答
1064 浏览

objective-c - 使用我自己的(不是共享的)NSUserDefaults 对象的 KVO 和绑定问题

我在我的应用程序中继承 NSUserDefaults。这样做的副作用是我不能使用[NSUserDefaults sharedUserDefaults],我必须有一个类方法来提供我自己的静态默认对象。这在代码中不是问题,但现在证明我正在将首选项 UI 与绑定连接起来很棘手。

共享的 NSUserDefaultsController 使用共享的默认值,所以就不行了。相反,我可以在我的窗口控制器中创建我自己的默认控制器,为它提供我的静态默认对象,并将我的绑定连接到它。但是,这并不完全有效。当我尝试在我的默认对象上使用 KVO 时,我没有收到任何更改通知。我使用常规的 NSUserDefaults 对象(不是子类)再次尝试了此操作,并且再次没有 KVO 通知。替换为共享默认对象,KVO 完全按照我的预期工作。

当我不使用共享默认值时,是否有人对我如何让绑定和 KVO 工作有任何想法?

0 投票
5 回答
11884 浏览

objective-c - 如何找到符合 KVC 的 Objective-C 对象的所有属性键?

是否有一种方法可以返回符合 NSKeyValueCoding 协议的对象的所有键?

类似的东西[object getPropertyKeys]会返回一个 NSString 对象的 NSArray。它适用于任何符合 KVC 的对象。这样的方法存在吗?到目前为止,我在搜索 Apple 文档时还没有找到任何东西。

谢谢,G。

0 投票
2 回答
1423 浏览

objective-c - 填充 NSTableView 后禁用自动选择行

我有两个 NSTableViews 填充了使用绑定链接的核心数据。当在 NSTableView1 中选择一行时,将填充 NSTableView2 并选择其中的第一行。我已经在它的 selectionIndex 上注册了与 NSTableView2 对应的 NSArrayController 和 KVO。这样当在 NSTableView2 中选择一行时,就会运行一个方法。我的问题是,当在 NSTableView1 中选择一行时,选择 NSTableView2 中的第一行来触发该方法。我想要它,以便我可以在 NSTableView1 中选择一行并填充 NSTableView2,而无需在 NSTableView2 中自动选择一行。这是如何实现的?

0 投票
2 回答
12199 浏览

objective-c - Cocoa 中的 Key Value Observing,内省 change 属性

我在布尔属性上使用键值观察 NSObject 方法:

这个关键路径的值中最有趣的部分是一个 BOOL,它在 YES/NO 之间不断翻转。我从更改字典中得到的最多是 kind = 1。无论如何,如果不探测我正在观察的对象以查看实际的更改值是什么?

谢谢。

0 投票
4 回答
1835 浏览

iphone - 如何在运行时动态地将 id 类型转换为具体类?

我有几个用于一个 UIViewController 的数据源。我的视图控制器使用 KeyValue Observing 来跟踪运行时某些属性的状态。当我交换数据源时,我需要停止观察这些属性。问题是,我不确定运行时数据源的类,因此这样的事情是无效的:

编译器需要一个具体的类才能知道对象的接口。在这种特殊情况下,如何获取数据源的类,然后为上面的 removeObserver:forKeyPath: 选择器键入数据源?我更喜欢动态/更智能的东西,而不是在 NSString 实例中缓存类的名称并在我切换时引用它。意思是,我总是可以做类似的事情:

谢谢。

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 回答
1016 浏览

cocoa - Cocoa 绑定:自定义设置方法?

我正在使用 Cocoa 绑定来管理对象表。我了解绑定是如何工作的,但我遇到了一个小问题。管理对象表会很好而且很花哨,除了这些对象必须管理实际的蓝牙硬件。我正在开发一个框架,该框架提供一个表示与该硬件的连接的类,并制作了另一个“管理器”类,使其符合键值。换句话说,这个管理器类必须能够连接并修改其属性字典中的“连接”状态,成为该硬件的代表并修改属性,并使用所做的更改更新硬件。

但是,每当我在对象本身中设置新值时,例如在将“连接”键的值更改为 2(查看)的“连接”方法中,(即propertiesDict = newDict),观察者似乎并没有注意到这种变化它是必然的。我看过里面observeValueForKeyPath:ofObject:change:context:NSKeyValueObservingProtocol。但是,我不知道如何处理上下文参数。

我希望这是有道理的……但如果有人有任何想法,我很想听听。

0 投票
2 回答
10254 浏览

objective-c - 如何通过 NSArrayController 获得模型更改的通知?

我有一个NSView绑定arrangedObjectsNSArrayController. 当数组插入或删除项目时,会通知视图。如果存储在数组中的模型的属性发生更改,如何通知它?

我是否需要将我的视图作为观察者添加到添加到数组中的每个项目的每个(相关)属性?

当一个项目被添加到数组中或从数组中删除时,我observeValueForKeyPath:ofObject:change:context:会在我的NSView子类中收到通知。我没有收到关于存储在数组中的模型的更改的通知,但是每次我收到插入通知时,我都可以将视图作为观察者添加到新项目的属性中。这是最好的方法吗?

我覆盖addObserver了模型类,以便我可以看到发生了什么,并注意到NSTableView绑定到的列arrangedObjects将自己作为观察者添加到适当的属性。这可以自动发生还是我手动设置观察?