喜研究員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