8

Tại sao tôi không thể quan sát thuộc tính editing của phiên bản UITableViewController?Quan sát thuộc tính chỉnh sửa của UITableViewController

Tôi đang sử dụng đoạn mã sau:

[self addObserver:self 
     forKeyPath:@"editing" 
      options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
      context:NULL]; 

Và đã thực hiện phương pháp này:

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

... nhưng phương pháp observeValueForKeyPath không bao giờ được gọi khi giá trị này thay đổi.


Theo Ensuring KVC Compliance phần của Apple:

Đối với tài sản mà là một thuộc tính hoặc một mối quan hệ to-one, điều này đòi hỏi rằng lớp học của bạn:

  • Thực hiện một phương thức có tên -<key>, -is<Key> hoặc có biến mẫu <key> hoặc _<key>.
  • Nếu thuộc tính có thể thay đổi, thì nó cũng phải triển khai -set<Key>:.
  • Việc triển khai phương pháp -set<Key>: của bạn không được thực hiện xác thực.
  • Lớp học của bạn nên triển khai -validate<Key>:error: nếu xác thực phù hợp với khóa.

Các tài liệu cho editing tài sản, nói rằng nó được định nghĩa là:

@property(nonatomic, getter=isEditing) BOOL editing 

Kể từ khách sạn này không thể thay đổi, điểm viên đạn duy nhất nó phải phù hợp với là người đầu tiên (tức là rằng có một phương pháp -is<Key> được định nghĩa, ví dụ). Bạn có thể thấy rằng nó phù hợp với điều này bằng cách nhìn vào tuyên bố của tài sản, và nhận thấy rằng có một phương pháp isEditing được xác định. Do đó, nó phải tuân thủ Tuân thủ giá trị khóa. Sao nó không hoạt động?

+0

Chỉ vì tò mò, tại sao bạn đang cố gắng quan sát thuộc tính, trái với việc thực hiện 'setEditing: animated:'? –

+0

@Gordon: để gỡ lỗi các lý do liên quan đến phương pháp đó. – Senseful

Trả lời

21

Bạn đang bối rối Key-Value Mã hóa tuân thủ Khóa-giá trị Quan sát tuân thủ. Tài sản tuân thủ KVC, có nghĩa là bạn có thể sử dụng [myViewController valueForKey:@"editing"] để truy cập nó (nếu bạn thích gõ), nhưng điều này không có nghĩa là nó tuân thủ KVO.

KVO-compliance is achieved by đối tượng hoặc thực hiện một setter KVC-compliant (gạch đầu dòng 2 và 3), mà KVO sẽ quấn tự động, hoặc bằng tay đăng thông báo KVO bằng cách gửi bản thân will/didChangeValueForKey: tin nhắn.

UIViewController và UITableViewController không công khai triển khai setEditing:; nếu họ không thực hiện nó ở tất cả, sau đó KVO gói nó tự động là ra ngoài. Điều đó để lại thông báo thủ công. Nếu bạn không nhận được bất kỳ thông báo KVO nào cho thuộc tính (và bạn thực sự nhấn vào thông báo addObserver:forKeyPath:options:context:), điều đó gợi ý rằng những lớp đó không thực hiện riêng tư setEditing: cũng như không đăng thông báo KVO theo cách thủ công.

Do đó, thuộc tính không thể quan sát được.

Nếu cách duy nhất bất cứ điều gì từng đặt thuộc tính editing là gửi thông báo setEditing:animated:, thì bạn có thể ghi đè setEditing:animated: và tự gửi thông báo KVO từ việc triển khai của mình và sau đó thuộc tính sẽ được quan sát.

+0

Cảm ơn câu trả lời thông tin. Tôi đã thấy trang mà bạn liên kết đến, nhưng thật không may, nó không giải thích nó cũng như bạn có. – Senseful

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