喜研究员iPhone开发者,iPhone键值观察报:观察员的UITableViewController
不登记我是一名经验丰富的软件工程师,但新来的iPhone平台。我已经成功实现了sub-classed视图控制器,并可以在视图控制器堆栈上推送和弹出父视图/子视图。但是,当在子视图控制器中编辑对象时,尝试更新视图控制器时遇到了麻烦。经过多次失败的实验之后,我发现了键值观察器API,这看起来像是完成这个任务的完美方式。然后我在主/父视图控制器中注册了一个观察者,并且在观察者中我打算重新加载视图。这个想法是,当在子视图控制器中编辑对象时,它将被触发。但是,我认为观察者没有被注册,因为我知道值正在编辑视图控制器中更新(我可以在调试器中看到它),但观察方法从未被调用。
请帮忙!
代码片段如下。
被观察对象。我相信这是键值兼容的,因为使用setvalue消息调用时设置的值(请参见下面的子视图控制器)。
X.h:
@interface X : NSObject <NSCoding> {
NSString *name;
...
@property (nonatomic, retain) NSString *name;
X.m:
@implementation X
@synthesize name;
...
主视图或者Controller.h:
@class X;
@interface XViewController : UITableViewController {
X *x;
...
主视图Controller.m或者:
@implementation XViewController
@synthesize x;
...
- (void)viewDidLoad {
...
[self.x addObserver:self
forKeyPath: @"name"
options: (NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:nil];
[super viewDidLoad];
}
...
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqual:@"name"]) {
NSLog(@"Found change to X");
[self.tableView reloadData];
}
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
子视图Controller.m或者:(此正确地设置在儿童视图控制器对象的值)
[self.x setValue:[[tempValues objectForKey:key] text] forKey:@"name"];
谢谢您指出缺陷。我发现如果我将观察者放在子视图控制器实例变量property(!)上,我可以触发事件。也就是说,在上面的例子中,当编辑按钮被按下时,我这样做: 主视图Controller.m ... ChildViewController.x = self.x; [ChildViewController.x \t的addObserver:自 \t \t \t \t \t forKeyPath:\t @ “姓名” 选项:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 上下文:NULL]; [[self navigationController] pushViewController:ChildViewController animated:YES]; ... – Scott 2009-10-23 01:29:52