8

Neden bir UITableViewController örneğinin editing özelliğini gözlemleyemiyorum?Bir UITableViewController düzenleme özelliğinin gözlenmesi

Ben aşağıdaki kodu kullanıyorum:

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

Ve yöntemini uyguladık:

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

... ama observeValueForKeyPath yöntem zaman bu değer değişiklikleri asla denir. Apple'ın Ensuring KVC Compliance bölümüne göre


:

  • -<key> adında bir yöntemi uygulamak: Bir öznitelik veya bire bir ilişki vardır özellikleri için

    , bu sınıf gerektirir -is<Key> veya örnek değişken <key> veya _<key>.

  • Özellik değiştirilebilir ise, o zaman -set<Key>: uygulamalıdır.
  • -set<Key>: yönteminin uygulamanız doğrulama yapmamalıdır.
  • Doğrulama anahtar için uygunsa, sınıfınız -validate<Key>:error:'u uygulamalıdır.

editing özellik için dokümantasyon, gibi tanımlanır belirtiyor: Bu özellik değişken olmadığından

@property(nonatomic, getter=isEditing) BOOL editing 

, sadece mermi noktası uygun olmalıdır ilkini edilir (yani Örneğin, bir -is<Key> yöntemi tanımlanmıştır. Buna, mülkün beyanına bakarak ve tanımlanmış bir isEditing yöntemi olduğunu fark ederek, bununla uyumlu olduğunu görebilirsiniz. Bu nedenle, Önemli Değer Gözlemleme uyumlu olmalıdır. Nasıl oluyorda çalışmıyor?

+0

Sadece meraktan dolayı, 'setEditing: animated:' uygulanmasının tersine, neden mülkleri gözlemlemeye çalışıyorsunuz? –

+0

@Gordon: Bu yöntemle ilgili hata ayıklama nedenleriyle. – Senseful

cevap

21

Sen Anahtar Değer uygunluğunu gözetmek Anahtar Değer ile uyumu Kodlama karıştırıyorsun. Özellik KVC uyumludur, yani [myViewController valueForKey:@"editing"]'u kullanarak yazabilirsiniz (yazmayı seviyorsanız), ancak bu KVO uyumlu olduğu anlamına gelmez.

KVO-compliance is achieved by nesne otomatik olarak bir KVC uyumlu ayarlayıcı (madde madde 2 ve 3), KVO kaydırılır uygulanması veya el kendisini will/didChangeValueForKey: mesaj göndererek KVO bildirimleri gönderme ya.

UIViewController ve UITableViewController, setEditing:; Bunu hiç uygulamıyorlarsa, otomatik olarak KVO sarma işlemi biter. Bu manuel bildirimleri bırakır. Bu özellik için herhangi bir KVO bildirimi almıyorsanız (ve aslında bu addObserver:forKeyPath:options:context: iletisine isabet ediyorsanız), bu sınıfların ne özel olarak setEditing: uygulamasını ne de KVO bildirimlerini el ile uyguladığını belirtir.Bu nedenle, özellik gözlemlenebilir değildir. Tek yolu şey hiç editing özelliği ayarlar

kontrolörünü bir setEditing:animated: mesajı göndererek, o zaman setEditing:animated: geçersiz kılmak ve uygulanmasından KVO bildirimlerine kendiniz göndermek ve ardından mülkiyet gözlemlenebilir olacak olabilir.

+0

Bilgilendirici cevap için teşekkürler. Bağlantı kurduğun sayfayı gördüm, ama maalesef senin de sahip olduğun gibi açıklamıyor. – Senseful

İlgili konular