我的应用程序中有两个类 A 类和 B 类。A 类和 B 类都是 UIViewController 的实例。 A 类有一个按钮,按下该按钮时会将 B 类推入堆栈。 B 类有一个字符串,A 类希望观察该字符串并根据需要更新其接口。我已经能够使用:[self addObserver:self forKeyPath:@"name" options:0 context:NULL];
在B类中查看字符串的变化。
当我尝试在 A 类 viewWillAppear 方法中使用以下内容时:
ClassB *b = [[ClassB alloc]init];
[b addObserver:self forKeyPath:@"name" options:0 context:NULL];
并添加方法:
(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object
change:(NSDictionary )change
context:(void )context
当尝试从 A 查看 B 中所做的更新时,不会触发任何操作。我觉得问这个问题很愚蠢,但是 KVO 在 iOS 中的两个类之间如何工作?我知道这应该有效。
您可以观察不同对象/类之间的变化。我认为问题出在选项参数中addObserver:forKeyPath:options:context:
.
对于您想要进行的观察类型,有多种选择。这KVO指南 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/Concepts/KVOBasics.html是一个很好的起点,但你可能想要NSKeyValueObservingOptionNew
,我在下面的示例中使用它。
首先,“name”应该是B类中的公共属性。
其次,您可能不需要将观察者添加到“b”中viewWillAppear
在 ClassA 中,因为您不需要每次 A 类视图出现时都添加它。当您创建 B 类视图时,您只需要添加一次观察者。添加观察者后,observeValueForKeyPath:ofObject:change:context:
方法将在 Class 中执行,因此您可以从那里更新 A 类 UI。每次 ClassA 即将出现时,你不需要做任何事情。
在类 A 中,您可能应该在将 ClassB 推送到控制器堆栈之前创建 ClassB,大概是在用户执行某些操作的事件处理程序中。创建 ClassB 后,立即使用正确的 NSKeyValueObservingOption 值在 ClassA 中添加观察者。
如果您只想在 ClassB 中的公共属性“名称”更改时收到通知,请尝试以下操作:
ClassB
@interface ClassB : UIViewController {
}
@property (retain) NSString* name;
- (void) aMethodThatModifiesName:(NSString*)newName;
@end
@implementation ClassB
@synthesize name;
- (void) aMethodThatModifiesName:(NSString*)newName {
// do some stuff
self.name = newName;
}
@end
ClassA
@interface ClassA : UIViewController {
}
@property (nonatomic, retain) IBOutlet UILabel* nameLabel;
- (IBAction) someEventHandler:(id)sender;
@end
@implementation ClassA
- (IBAction) someEventHandler:(id)sender {
ClassB* b = [[ClassB alloc]init];
[b addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL];
[self.navigationController pushViewController:b animated:YES];
[b release];
}
- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
if ([keyPath isEqual:@"name"]) {
NSString* changedName = [change objectForKey:NSKeyValueChangeNewKey];
// do something with the changedName - call a method or update the UI here
self.nameLabel.text = changedName;
}
}
@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)