안녕 동료 아이폰 개발자,아이폰 키 - 값 옵서버 : 관찰자 내가 아이폰 플랫폼에 대한 경험이 풍부한 소프트웨어 엔지니어하지만 새로운 오전있는 UITableViewController
에 등록하지. 서브 클래 싱 된 뷰 컨트롤러를 성공적으로 구현했으며 뷰 컨트롤러 스택에서 부모/자식 뷰를 밀고 팝 할 수 있습니다. 그러나 개체 뷰 뷰 컨트롤러에서 개체를 편집 할 때보기 컨트롤러를 업데이트하는 동안 문제가 발생했습니다. 많은 실험을 거치지 않은 후에 키 - 값 관찰자 API를 발견했습니다.이 API는이를 수행하는 완벽한 방법으로 보입니다. 그런 다음 주/부모보기 컨트롤러에 관찰자를 등록하고 관찰자에서보기를 다시로드하려고합니다. 아이디어는 자식보기 컨트롤러에서 개체를 편집 할 때 해고됩니다. 그러나, 나는 그 값이 편집 뷰 컨트롤러 (디버거에서 볼 수 있음)에서 업데이트된다는 것을 알고 있기 때문에 관찰자가 등록되지 않았다고 생각합니다. 그러나 관찰 방법은 절대로 호출되지 않습니다.
도와주세요!
코드 조각은 다음과 같습니다.
관찰 대상. 이 값은 setvalue 메시지 (아래의 Child View Controller 참조)를 사용하여 호출 할 때 값이 설정되므로 키 - 값을 준수한다고 생각합니다.
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는 : forKeyPath : 당신이 addObserver를 호출하기 전에 viewDidLoad에()에서 X 개체를 인스턴스화하는 경우
[self.x setValue:[[tempValues objectForKey:key] text] forKey:@"name"];
결함을 지적 해 주셔서 감사합니다. 난 내가 대신 아이 뷰 컨트롤러 인스턴스 변수 특성에 관찰자를 넣어 경우 이벤트가 발생 얻을 수 있다는 것을 발견했다 (!). 즉, 편집 버튼을 누를 때, 나는이 수행 위의 예에서, : 홈페이지보기 Controller.m ... ChildViewController.x = self.x; [ChildViewController.x \t addObserver : 자기 \t \t \t \t \t forKeyPath : (NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 컨텍스트 : "이름" 옵션 @ \t NULL] [자기있는 navigationController]과 pushViewController : ChildViewController 애니메이션 : YES]; 은 ... – Scott