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

cocoa - Key-Value-Observing a to-many relationship in Cocoa

我试图让键值观察为 NSMutableArray 工作。下面是观察类 MyObservee 的 .h 文件:

MyObserver 类实现了 observeValueForKeyPath:ofObject:change:context:。这是我添加观察者的方法:

为什么 addObject: 消息没有作为 someArray 键路径的更改触发?我有一种感觉,这里有一些我不完全理解的东西。

0 投票
2 回答
1118 浏览

cocoa - 如何从 CoreData-Entities 获取一些值到代码中

我在我的 CoreData 应用程序中创建了一个具有一些属性的实体。想象一个 tableview 和一个绑定的 NSArrayController。我创建(和编辑)我的实体“实例”。我的问题是如何将这些属性的值添加到我的代码中。如果还有更多问题:http: //twitter.com/xP_ablo

0 投票
3 回答
2238 浏览

cocoa - observeValueForKeyPath:ofObject:change:context: 不适用于数组

我有一个对象,它为一个名为contents. 在那些访问器中,当我修改底层数组时,我调用willChange:valuesAtIndexes:forKey:didChange:valuesAtIndexes:forKey:

我还有一个自定义视图对象,它contents通过NSArrayController. 在我见过observeValueForKeyPath:ofObject:change:context:的变化字典中唯一的值是. 当我向数组添加对象时,我希望看到.NSKeyValueChangeKindKeyNSKeyValueChangeSettingNSKeyValueChangeInsertion

正如您想象的那样,每次插入单个项目时重新创建它观察到的对象的视图的内部表示 - 特别是当我批量加载数百个项目时 - 会带来相当大的性能问题。每次添加或删除单个项目时,Cocoa 似乎都认为我正在设置一个全新的数组,我做错了什么?

0 投票
5 回答
6031 浏览

iphone - 是否可以在 Cocoa Touch 中观察对象的只读属性?

我试图观察 UINavigationController 的(只读)visibileViewController 属性,但没有成功。我能够成功地观察到我自己定义的用于在另一个类上进行测试的读写属性。

是否可以观察只读属性?

0 投票
4 回答
38312 浏览

objective-c - 在视图控制器之间进行通信的最佳方式是什么?

作为 Objective-c、cocoa 和 iPhone 开发的新手,我强烈希望充分利用语言和框架。

我正在使用的资源之一是斯坦福大学的 CS193P 课堂笔记,他们留在网上。它包括讲义、作业和示例代码,并且由于该课程是由 Apple 开发人员提供的,我绝对认为它是“从马的嘴里”。

课程网站: http:
//www.stanford.edu/class/cs193p/cgi-bin/index.php

第 8 课涉及构建基于 UINavigationController 的应用程序的作业,该应用程序将多个 UIViewController 推送到 UINavigationController 堆栈上。这就是 UINavigationController 的工作原理。这是合乎逻辑的。但是,幻灯片中有一些关于 UIViewController 之间通信的严厉警告。

我将引用这张严肃的幻灯片:
http ://cs193p.stanford.edu/downloads/08-NavigationTabBarControllers.pdf

第 16/51 页:

如何不共享数据

  • 全局变量或单例
    • 这包括您的应用程序委托
  • 直接依赖关系使您的代码可重用性降低
    • 而且更难调试和测试

好的。我对此很失望。不要盲目地将用于在 viewcontroller 之间进行通信的所有方法都扔到应用程序委托中,并在应用程序委托方法中引用 viewcontroller 实例。公平'nuff。

再进一步,我们得到这张幻灯片,告诉我们该做什么。

第 18/51 页:

数据流的最佳实践

  • 弄清楚需要传达的确切内容
  • 为您的视图控制器定义输入参数
  • 为了在层次结构上进行通信,请使用松散耦合
    • 为观察者定义一个通用接口(如委托)

这张幻灯片之后是一张看似占位符的幻灯片,讲师随后使用带有 UIImagePickerController 的示例显然演示了最佳实践。我希望视频可用!:(

好吧,所以……我的objc-fu恐怕不是那么强。我也对上面引用的最后一行感到有些困惑。我一直在做我的谷歌搜索,我发现一篇似乎不错的文章谈论了观察/通知技术的各种方法:http:
//cocoawithlove.com/2008/06/five-approaches-to -listening-observing.html

方法 #5 甚至将委托表示为一种方法!除了.... 对象一次只能设置一个委托。那么当我有多个视图控制器通信时,我该怎么办?

好的,这就是组织的帮派。我知道我可以通过引用我的 appdelegate 中的多个 viewcontroller 实例轻松地在应用程序委托中执行我的通信方法,但我想正确地做这种事情

请回答以下问题,帮助我“做正确的事”:

  1. 当我试图在 UINavigationController 堆栈上推送一个新的视图控制器时,应该 由谁来做这个推送。哪个类/文件是正确的位置?
  2. 当我想在我的一个 UIViewControllers 中影响一些数据(iVar 的值)执行此操作的“正确”方法是什么?
  3. 假设我们一次只能在一个对象中设置一个委托,当讲师说“为观察者定义一个通用接口(如委托)”时,实现会是什么样子。如果可能的话,一个伪代码示例在这里会非常有帮助。
0 投票
1 回答
282 浏览

cocoa - 使用自定义访问器观察属性

假设我想观察hiddenUIView 上的属性:

@property(nonatomic, getter=isHidden) BOOL hidden

我是为 keypath 添加一个观察者hidden还是isHidden

0 投票
4 回答
5669 浏览

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

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

0 投票
2 回答
2236 浏览

cocoa - 根据计算值为计算值设置 KVO

所以我有两个对象,Invoice 和 InvoiceLineItem。InvoiceLineItem 有一个名为的属性cost,它是基于其他属性动态创建的。为了帮助我使用 KVO/绑定:

这很好用。当我编辑像 serivceCost 这样的属性时,表视图中的主要成本会更新得很好。

在 Invoice 对象中,我有一个 InvoiceLineItems 的 NSMutableArray。Invoice 有一个类似的属性,称为totalCost. 它是通过迭代行项目来计算的,只要行项目没有被标记为已删除(我这样做是出于同步原因),它就会将成本相加并创建总成本。

现在我的问题/问题。如何设置 Invoice 的 totalCost 以便在行项目的成本之一发生更改时它与 KVO/绑定一起使用?

我尝试设置:

但它不起作用。我最终在控制台中出现错误:[<NSCFArray 0x1499ff40> addObserver:forKeyPath:options:context:] is not supported. Key path: cost

0 投票
1 回答
2088 浏览

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

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

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

0 投票
2 回答
4785 浏览

objective-c - 协议对象上的键值观察:addObserver 上的编译器警告:

我有一个带有属性的简单协议:

我在其他地方添加了一个键值观察器来监听“stops”属性的变化:

代码按预期工作,因为当“停止”属性更改时,我得到了 observeValueForKeyPath 事件。真正的烦恼是 addObserver 调用上的编译器警告:

'addObserver' 方法在 NSObject 的类别中定义:

有没有办法让 XCode 放弃这个警告?我的理解是协议不能采用类别,所以我不确定如何将 NSKeyValueObserverRegistration 方法引入我的协议中,而不是将声明复制到协议本身中,这似乎是一种 hack。

我知道这是一个微不足道的问题,因为它只是一个编译器警告,但我很想知道是否有一种“正确”的方法来解决这个问题。