2012-02-13 41 views
6

Tôi có một bộ điều khiển xem với chế độ xem thay đổi (ví dụ) và tôi muốn quan sát khung của bất kỳ chế độ xem nào mà self.view được đặt thành. Có sự khác biệt giữa:Điều gì sẽ sử dụng làm đường phím trong KVO?

[self.view addObserver:self forKeyPath:@"frame" options:0 context:nil]; 

[self addObserver:self forKeyPath:@"view.frame" options:0 context:nil]; 

Đối với một thứ hai, nếu những thay đổi quan điểm sẽ thông điệp vẫn được nhận được khi nhìn mới của những thay đổi khung hình, hoặc sẽ chỉ gửi tin nhắn nếu khung của khung nhìn đã được thiết lập khi người quan sát được thêm vào?

Có cách nào để quan sát các thay đổi đối với thuộc tính khung ngay cả khi chế độ xem của bộ điều khiển chế độ xem thay đổi sau khi thêm người quan sát?

Trả lời

7

Sử dụng đường dẫn thứ hai. @"view.frame" sẽ thông báo cho bạn về các thay đổi của khung hình ngay cả khi chính chế độ "xem" bị thay đổi. Cacao sẽ thêm các nhà quan sát cho mọi đối tượng trong chuỗi "chuỗi khóa" cho bạn một cách tự động (có nghĩa là mọi mục trong khóa chính phải tương thích với KVO).

+0

Yea, đúng, toàn năng sức mạnh của KVO đã được tiết lộ! –

2

Bạn hỏi nếu có một sự khác biệt giữa hai, Câu trả lời là có, có sự khác biệt giữa chúng:

Đầu tiên một

nói "tôi như một cái nhìn", tôi thêm một người quan sát có tên self (aka) viewControllerObject, nếu bạn gọi nó trong viewController.m bất cứ khi nào thuộc tính của tôi có tên là "frame" được thay đổi.

thứ hai một

Says "tôi như ViewController" tôi thêm myselfAsAnObserver bất cứ khi nào theKeyPath tên "view.frame" được sửa đổi.

Vì mỗi người quan sát nên thực hiện

-(void)observeValueForKeyPath:(NSString *)keyPath 
        ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 

Đối với trường hợp này, bạn sẽ không nhận thấy sự khác biệt nhiều vì bạn đã thêm một viewController như một người quan sát ở một trong hai phương pháp trên, nhưng nó sẽ làm cho một sự khác biệt khi bạn đang đối phó với các đối tượng khác nhau. Nhưng quy tắc rất đơn giản, mỗi người quan sát thêm nên thực hiện

-(void)observeValueForKeyPath:(NSString *)keyPath 
        ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 

Một điều nữa: của nó là một ý tưởng tốt để tạo ra một bối cảnh để quan sát ví dụ

//In MyViewController.m 

//.. 
static int observingViewFrameContext 


// In ... 
[self addObserver:self 
     forKeyPath:@"view.frame" 
      options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
      context:&observingViewFrameContext]; 


// .. don' forget to remove an observer ! too 
Các vấn đề liên quan