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

iphone - 将 KVO 与自定义 UITableViewCell 和 CoreData 一起使用

我已经阅读了大量关于 KVO 的文档和教程,但我还没有找到任何我能够为我的应用程序抽象的内容。我有一个表格视图,它使用自定义 UITableViewCell 类来提供用于打开/关闭选项的界面。该单元格有一个 UISwitch,我想将它“绑定”到我的模型的布尔属性。我希望在渲染单元格时,它应该为托管对象适当地设置控件的 on 属性,并且当我翻转该开关控件时,模型对象将更新为新值。

我开始研究它,但我认为合适的第一步没有奏效。

0 投票
2 回答
513 浏览

cocoa - 如何确保我的类似 NSSlider 的自定义控件的 KVO 行为正确?

假设您有一个类似于 NSSlider 的自定义控件,但支持选择一系列值,而不是单个值。属性的明显选择是 minValue、maxValue、leftValue、rightValue,或者你想命名它们。
您可能还想确保 leftValue 和 rightValue 始终位于 minValue 和 maxValue 之间。minValue 和 maxValue 相同。您不希望它们潜在地使现有的 leftValue 和 rightValue 无效,例如通过将 maxValue 设置为低于当前 rightValue 的值。

到目前为止非常直截了当。

但是,在确保适当的 KVO 可访问性/合规性的情况下,您会怎么做?您根本无法确保 KVO 以正确的顺序设置属性(即首先设置最小和最大限制,然后设置其他值)。

我碰巧有这样一个 UI 元素,如果不打开错误设置值的大门,我根本无法弄清楚要让它运行起来。

自定义控件旨在绑定到模型对象。如果我现在使用值创建这样的模型(最小值:0.00 最大值:42.00 左侧:14.00 右侧:28.00)我最终在自定义控件中进行以下设置(最小值:0.00 最大值:42.00 左侧:1.00 右侧:1.00)

这样做的原因是,它不是先调用 minValue 和 maxValue,而是先调用 leftValue 和 rightValue,这导致两个值都以 1.0(这是默认的 maxValue)结束。(然后将 maxValue设置为适当的值。)

当你希望 Apple 开放 Cocoa 的来源时,正是在这种时候。或者至少是一些用于更深入检查的控件。

您将如何实施这样的控制?

或更笼统地说:在遵守 KVO 的同时实现具有交叉依赖属性的类的最佳实践是什么?

0 投票
1 回答
1756 浏览

iphone - 核心数据、KVO 和 NSInternalInconsistencyException

我正在使用 Core Data 和 KVO 来查找值的更改以触发保存到数据存储。我有一个与搜索挂钩的表格视图NSFetchedResultsController。当搜索发生变化时,会在按下 Search 按钮时创建一个新的结果控制器。当用户在结果表视图中选择项目时,用户会进入详细视图并可以进行编辑。

这就是我遇到问题的地方。当用户在我所做的单独 UIControl 中进行更改时,会通知详细视图并且可以使用NSFetchedResultsController它从表格视图将我推送到视图堆栈时记住的信息来获取NSManagedObjectContext并进行保存。当我这样做时,有时会收到以下错误:

我发现当我进行搜索并且不在表格顶部的对象被移动到顶部时,往往会发生这种情况。我隐约知道我的脑后可能出了什么问题,但希望能提供有关如何解决此问题的任何指示。

0 投票
2 回答
5155 浏览

cocoa - Key Value Observing 和 NSButton 状态

我正在尝试观察复选框状态并在复选框状态更改时在应用程序中进行适当的更改。在使用复选框管理窗口的窗口管理器中,我有以下观察者设置:

我还将 myCheckBox 连接到文件所有者(即窗口控制器)到窗口中的适当复选框。但是,当我运行我的应用程序observeValueForKeyPath:ofObject:change:context:方法时,它永远不会被调用。

我究竟做错了什么?

0 投票
2 回答
479 浏览

iphone - 为 NSNotification 注册一个布尔值

我正试图围绕 NSNotification 进行思考,但似乎无法让它发挥作用。认为我误解了如何注册通知。

我的连接管理器类中有一个布尔值作为属性。在初始化时,我使用一些服务器进行身份验证,并检查我是否可以访问外部 URL(应用程序主要用于公司内部网,并且并不总是可以进行外部连接)

如果它无法访问连接,则 BOOL 属性将从 YES 更改为 NO,因为这可以随时响应,我认为最好在更改时注册通知。该属性称为 externalConnectionAvailable

并有方法:

但这不会被调用。我做错了什么吗?

谢谢

0 投票
1 回答
2950 浏览

objective-c - 需要调用 willChangeValueForKey: 和 didChangeValueForKey: 吗?

我认为自制的@property setter 应该是这样的:

但是我在博客文章中看到了很多代码,这些代码是由比我做 Cocoa 的人的时间长得多的人写的,就像这样:

所以我的问题是,我们需要调用 KVO 通知方法吗?或者,如果您使用的是现代运行时,它是否在您更新私有 iVar 时神奇地完成了?

0 投票
1 回答
3250 浏览

cocoa - KVO 问题“无法移除观察者”

我有一个 NSArrayController 链接到核心数据对象,设置为自动重新排列内容并由谓词过滤。一切都很好,直到我试图取消一段关系并分配另一个。那时,我的应用程序崩溃并且我收到以下错误:

无法从 Object 中删除键路径“career.type”的观察者,很可能是因为键“career”的值已更改而未发送适当的 KVO 通知。检查 Person 类的 KVO 兼容性。

通过窥探,似乎将我的 NSArrayController 设置为 Auto Rearrange Content 会导致此问题。但我正在尝试解决问题,而不必求助于手动重新排列 NSArrayController。这是触发错误的伪代码:

这是我的 NSArrayController 使用的谓词:

其中两个实例的 %@ 是一个 CoreData 对象。

基本上,看起来 NSArrayController 为 object.career.type 设置了一个观察者,并且当该观察者被自动删除时,使关系无效会导致问题。所以我想知道我是不是走错了路?我是否应该获取对象的副本,将其从 MOC 中删除并重新插入,并将职业设置为 nil 并相应地设置字段?

如何正确通知观察者类型已被取消?请注意,这里提到的所有属性和关系都使用 vanilla KVO 兼容的 getter/setter。

0 投票
1 回答
2060 浏览

iphone - KVO 和 NSNotifications 的性能速度?

我应该害怕使用 Key-Value Observations (KVO) 和 NSNotifications 吗?我开始在我的应用程序中使用它们,但我对可能触发应用程序范围调用或自动执行某些操作的概念有点陌生,并且有点害怕这种开销可能带来的性能影响。

我的担心是没有根据的吗?我应该像任何其他方法调用一样使用它们吗?它们看起来非常方便并且填补了很多空白,所以如果可能的话,我想使用它们。注意:我主要为 iOS 设备编程,所以性能一直是我关心的问题。

0 投票
1 回答
13614 浏览

iphone - 使用 NSArray 观察键值

我已经在 SO 上查看了将 Key Value Observing 与NSArray(or NSMutableArray) 结合使用的示例,显然您需要使用 an NSArrayController(这与KVO我不熟悉的情况不同),但我还没有找到具体示例来说明如何执行此操作。任何人都可以用一些示例代码来解释吗?

例如,如果我有一个用ofGameModel表示其玩家姓名的 a 。我想观察这些字符串(视图控制器观察模型的数据)以更新视图中的各种内容。NSArray (playerNameArray)NSStrings

如何获得玩家名称数组已更改的通知?

编辑:iOS SDK 甚至支持NSArrayController吗?如果没有,还有其他方法吗?

0 投票
1 回答
912 浏览

objective-c - 当 KVO 从模型设置器触发时,防止递归地重新输入 observeValueForKeypath

我有一大堆模型可以观察自己的变化。当触发 setter 时,模型中的观察者会被调用,并且在该模型中,我调用 Web 服务器并更新 Web 服务器中的信息,以便它正确地拥有应有的数据。

但是,在我对 Web 服务器的调用中,我可以从连接断开、服务器重置等到服务器说不允许更新(例如,另一个用户更改的某些其他参数阻止了更新)。

哦,断开数据存储的乐趣……

有什么方法可以self在不重新触发 KVO 操作的情况下更新(即模型)?

当我得到响应时,我可以关闭观察者,但是在执行后台服务器请求时,可以对同一对象进行另一个用户操作。这将中断另一个呼叫。

请参阅此处的帖子,了解我为首先进行观察而尝试做的事情以及完整模型的代码示例。

我正在拨打电话的部分将在观察者中,如下所示:

你们似乎总是能得到一些很好的建议,我总是很感激你们提出的任何建议。