2013-02-14 17 views
15

Tôi đã có một tài sản có tên myName trong lớp học của tôi, như:Gửi Notification Khi một tài sản được thay đổi Sử dụng KVO

@property (nonatomic, strong) NSString *myName; 

tôi cần phải gửi một thông báo khi giá trị tài sản của myName được thay đổi.

Bây giờ tôi đang làm một cái gì đó như:

- (void)setMyName:(NSString *)name 
{ 
    _myName = name; 
    [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; 
} 

Tôi biết có cái gì đó giống như Key-Value Observing trong iOS. Nhưng tôi không biết làm thế nào để thực hiện nó, tôi đọc toàn bộ tài liệu, nhưng không thể hiểu rõ.

Vui lòng giúp tôi hiểu cách triển khai giống nhau mà không cần sử dụng công cụ tùy chỉnh.

Trả lời

31

Hãy thử điều này:

MyClass *var = [MyClass new]; 
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil]; 

và thực hiện

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

} 

phương pháp này sẽ được gọi bất cứ lúc nào khi sở hữu Myname thay đổi

+0

Cám ơn câu trả lời của bạn :) –

+0

bạn đều được chào đón) – alex

+0

Hi, tôi đã tự hỏi nếu giải pháp KVO là tốt hơn sau đó thực hiện khác dung dịch. Bất cứ ai có thể giải thích điều đó? – NicTesla

15

Trong - (void)setMyName:(NSString *)name làm điều này thay vì

[self willChangeValueForKey:@"myName"]; 
_myName = name; 
[self didChangeValueForKey:@"myName"]; 

//this generates the KVO's 

Và nơi bạn muốn nghe (các viewController), có trong viewDidLoad thêm dòng này:

[w addObserver: tự forKeyPath: @ "Myname" lựa chọn: NSKeyValueObservingOptionNew bối cảnh: nil];

// Bằng cách này, bạn đăng ký viewController để nghe KVO.

và cũng thực hiện phương pháp này:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { 
     return; 
    } else { 
     //read the change dictionary, and have fun :) 
    } 
} 

// phương pháp này được gọi, bất cứ khi nào giá trị của tài sản được thay đổi.

+0

Cảm ơn câu trả lời của bạn :) –

+3

Câu trả lời này tốt hơn nhiều so với câu trả lời được chấp nhận, không cho thấy cách thực hiện KVO, chỉ cách nghe các thông báo KVO đã được triển khai – Chris

7

Để thực hiện việc này mà không cần thiết lập khách hàng, chỉ cần tổng hợp trình thiết lập thuộc tính. Điều này sẽ tạo tất cả các cuộc gọi hỗ trợ tới willChangeValueForKey/didChangeValueForKey.

@synthesize myName;

giá trị tài sản Sau đó thiết lập với dot-cú pháp:

self.myName = @ "Inigo Montoya"

Sau đó, các quan sát viên sẽ nhận được thông báo KVO tự động.

(Bạn sẽ cần phải loại bỏ các quan sát viên trước khi bạn thả đối tượng quan sát.)

+0

Cảm ơn câu trả lời của bạn :) –

Các vấn đề liên quan