问题标签 [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 投票
1 回答
2923 浏览

cocoa - 在 Cocoa 中实现 KVO/Bindings-Compliant 桥接模式

我正在尝试在可可中实现一个简单的对象桥,其中桥对象充当某个任意其他 NSObject 实例的 kvo/bindings-compliant 下降。

这是我的问题(下面的代码中有更多详细信息):

桥接对象充当 Person-Object 的一个插入点,具有一个名为name的 NSString* 属性和一个 Address* 属性address。绑定到 Bridge 的 keyPath“名称”或“地址”效果很好。当将某个对​​象绑定到桥的 keyPath“address.street”并且为 Person 的address属性设置了一个新的 Address-Object 时,麻烦就开始了。这会导致与 KVO 相关的异常如下所示:

Cannot remove an observer <NSKeyValueObservance 0x126b00> for the key path "street" from <Address 0x12f1d0> because it is not registered as an observer

即使网桥注意到“地址”属性的变化并发出 willChangeValueForKeyPath/didChangeValueForKeyPath 元组,也会发生这种情况。

下面的代码产生了问题。它是自包含的 Objective-C 代码,可以保存在文件“BridgeDemo.m”中并编译运行

如果你知道这个问题的解决方案,或者可以为我提供更好的方法来解决同样的问题,那么你会让我成为一个非常快乐的程序员!

BridgeDemo.m:

0 投票
5 回答
1019 浏览

cocoa - 从共享实用程序窗口和最前面的文档窗口绑定的好方法是什么?

我有一个允许打开多个 NSDocument 的应用程序。在这个应用程序中是一个单一的实用程序窗口,其中包含一些我想应用于最前面的文档的功能。

我在这里尝试使用绑定,所以诀窍是如何将实用程序窗口的用户界面干净地绑定到最前面的文档。目标是切换最前面的文档窗口将更新实用程序窗口中的视图;当文档模型的状态发生变化时,绑定到最前面文档模型属性的控件将被适当地更新,等等。

对于从这样的窗口发送动作,很容易只使用第一响应者;文档对象可以通过响应者链拦截动作。但我想要的不止这些,当然你不能绑定到第一响应者。

我有几个想法:

  • 在我的笔尖中为共享窗口放置一个对象控制器。当文档窗口更改最前面的状态时,更改该绑定的内容。这样做的一个缺点是,如果我有另一种实用程序窗口,我必须记住将文档窗口的绑定也连接到该实用程序窗口!
  • 在应用程序委托中创建一个访问器,通过遍历窗口列表来获取最前面的文档窗口。我的实用程序窗口将通过应用程序委托的方法进行绑定。这里的一个缺点是它不符合 KVO
  • 在应用程序委托中有一个 getter 和 setter 来确定(并且可能设置为与 KVO 兼容?这有意义吗?)最前面的文档。当窗口失去主状态时,也许使用窗口通知将 ivar 设置为适当的值。更新:我现在正在使用它,它实际上看起来很干净。我从我的文档窗口的windowDidBecomeMain通知中设置值并在windowWillClose中清除它(如果它是当前值)。除非有任何重大反对意见,否则这可能是我将使用的方法。
  • 一个想法是绑定到 mainWindow.windowController.document ......这很接近,除了当我的共享窗口变为主窗口时,这个绑定就消失了。所以我真的需要找到最前面的文档窗口的控制器(以及正确的类)。

这些似乎都不对。有没有更好的方法来做到这一点,我错过了?

0 投票
3 回答
288 浏览

cocoa - 是否可以使用 KVO 访问代理对象的先前/当前值?

我有一个 NSArrayController,我正在使用 KVO 来观察它的选择方法的旧/新值。

这完美地工作(在选择更改时触发,通常情况下),除了更改字典中的项目全部为空而不是旧/新选定对象。[arrayController selection] 仍然返回正确的对象,但如果可能的话,我希望能够访问先前选择的对象(我的解决方法可能是观察选定的索引,看看它是否有效)。

我想出的唯一可能的原因可能是因为 NSArrayController 是一个代理对象。

那么这是预期的行为,还是发生了一些奇怪的事情?

编辑:我尝试只观察索引,但这也不起作用。旧键和新键仍然显示为空。

0 投票
7 回答
35273 浏览

cocoa - 观察 NSMutableArray 以进行插入/删除

一个类具有类型为 NSMutableArray 的属性(和实例 var),并带有合成访问器(通过@property)。如果您使用以下方法观察此数组:

然后像这样在数组中插入一个对象:

发送observeValueForKeyPath... 通知。但是,以下确实发送了正确的通知:

这是因为mutableArrayValueForKey返回一个负责通知观察者的代理对象。

但是合成的访问器不应该自动返回这样一个代理对象吗?解决这个问题的正确方法是什么——我应该编写一个只调用的自定义访问器[super mutableArrayValueForKey...]吗?

0 投票
4 回答
20191 浏览

objective-c - setNeedsDisplay 不工作?

我在简单的可可应用程序中重绘自定义视图时遇到问题。绘图基于一个简单的 NSSlider 正在更改的参数。但是,尽管我实现了 -setParameter: 和 -parameter 方法并将滑块的值绑定到界面构建器中的该参数,但我似乎无法制作自定义视图来重绘自身。

重绘的代码是这样的:

尽管视图本身不会重绘,但我确实收到了有关设置新参数的消息。欢迎任何想法!

0 投票
5 回答
1009 浏览

cocoa - 可可中不区分大小写的KVC?

对于我正在考虑使用的特定方法,我将不胜感激。场景如下。

我有一个对象(我们称之为 MObject),它有许多属性,比如 x 和 y 坐标、高度和宽度。这些属性是根据 KVC 指南命名的(MObject.x;MObject.height 等)。我的下一个任务是读入描述这个 MObject 的 XML 文件。不幸的是,XML 元素的名称不同——X 和 Y、高度和宽度(注意大写)。

理想情况下,XML 元素将与 MObject 的属性相匹配。在这种情况下,我可以使用 KVC 并避免一大堆代码:

解决此问题的一种方法是使用不区分大小写的键。我会从哪里开始呢?还有其他更好的解决方案吗?

建议非常感谢。

0 投票
3 回答
2500 浏览

objective-c - 如何使用 NSBrowser 中所选单元格的路径更新 NSPathControl

我需要使用 NSBrowser 中当前选择的路径来更新 NSPathControl,但是当路径从 NSBrowser 发生更改时,我无法找出获取通知的方法。执行此操作的理想方法只是观察 NSBrowser 中的路径键路径,但这使得 KVO 只能观察<key>返回 void 消息且没有更新的 set 方法(setPath 返回 bool 成功值)。

I also tried observing the selectedCell key path, but I'm not getting notifications when the selection there is changed.

还有其他一些我想念的非常明显的方法吗?

0 投票
2 回答
7441 浏览

iphone - 键值编码

当我启动一个简单的 iPhone 应用程序时,我有一种直接的方法将 XML 摘录的键/值对转换为 NSDictionary。问题是,我需要将那些曾经填充我的 UITableView 的 NSDictionary 实例转换为自定义类,因为它们需要行为和额外的复杂性。这里的问题是,现在为了让我实例化一个对象并用来自 Web 服务的键/值对填充其实例变量变得更加困难。我不能再将它放入一个遍历 XML 并使用 KVC 设置其实例变量的方法中。

还有什么样的其他解决方案?

0 投票
1 回答
339 浏览

objective-c - Key-Value coding and its scripting capability

I have an object which straight forward instance variables. Some are NSString, some are unsigned ints, etc. I was under the impression Key-Value coding was scriptable in that I could write code such as the following:

The reason I'm using stringValue here and name is I'm working with TouchXML and building objects from XML feeds.

The code above crashes if I try to assign anything to an integer. If I change my unsigned int to an instance of NSString, there isn't any run-time crashes. It was to my understanding that Key-Value coding is smart enough to detect these issue.

What are my possible solutions? How can I abstract this as much as possible so I can run the same method on many different classes which all have their own instance variables?

Is the most elegant method to really override my setter and use NSNumber to convert the string into a type int, which I thought was already handled by KVC?

0 投票
3 回答
617 浏览

cocoa - 如何为 NSApp.dockTile 的创建绑定

在 IB 中,很容易将标签或文本字段绑定到某个控制器的 keyPath。

NSDockTile(可通过 [[NSApp dockTile] setBadgeLabel:@"123"] 获得)未出现在 IB 中,我无法弄清楚如何以编程方式绑定其“badgeLabel”属性,就像您可能绑定标签/文本字段/表格列一样.

有任何想法吗?