【发布时间】:2012-06-01 07:37:36
【问题描述】:
我试图了解 iOS 中的关键值观察,但我认为我做的事情不正确。 作为一个想法,我尝试将观察者添加到视图控制器的属性(与 IBOutlet 连接的视图)。这个视图(tableIndicator)是动画的,所以我想看看我是否可以让观察者在视图的框架发生变化时做出反应。
所以我在视图控制器的 viewDidLoad 中做了以下操作:
[tableInidicator addObserver:self forKeyPath:@"frame" options:0 context:nil];
tableIndicator 是我的视图/类属性,我将视图控制器(自身)添加为观察者,默认选项为 0,被观察的键值为框架。
那么,我等着看这个函数是否会随着帧的变化而触发:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"value changed");
}
...但是什么也没发生。
我不一定要修复此代码,因为它除了让我理解它之外没有其他用途,如果有人能指出我做错了什么,我将不胜感激。一些好的例子/教程也会很棒。
我发现的那些(http://iphonedevelopment.blogspot.ro/2009/02/kvo-and-iphone-sdk.html/http://nachbaur.com/blog/back-to-basics-using-kvo)没有涵盖这种情况。他们只是应用于一个类以观察其属性之一的观察者,而不是类中(自定义)对象的属性,我认为这对我更有用。
提前谢谢你
[edit]对于那些会错过我对已接受答案的评论的人:
更改视图的中心显然不会触发 frame 属性的观察者。您必须更改框架本身。
【问题讨论】:
-
据我所知,如果 tableindicator 是您的视图控制器,那么请使用 NSNotification 而不是 KVO
-
我知道如何使用 NSNotification。我正在尝试为此使用 KVO,以便更好地理解这种技术。
-
我知道这是一个很久以前就已经回答的老问题了,但为了其他可能找到它的人,我想添加评论。关于 UIKit 中视图的“框架”,您应该意识到它是从“边界”和“中心”中找到的值合成的。如果要对视图的位置或大小进行 KVO,通常最好观察边界或中心,而不是框架属性。如果您直接更改 frame 属性,它只会触发 KVO 通知。
标签: objective-c ios key-value-observing