2016-04-02 30 views
2

KVO kullanarak öğeleri bir diziye eklenmiş olup olmadığını kontrol etmek istiyorum ve örneği Apple'ın belgelerinden kopyaladım, ancak kod çalıştığında dizinin boyutu güncellendiğinde yakalanmaz. İşte ne var şimdi: Ben diziye gösterileri ekledikten sonraKVO öğelerinin bir diziye eklendiğini anlamak için KVO kullanma

class ShowDirectory: NSObject { 
    var shows = [Show]() 
    dynamic var showCount = Int() 
    func updateDate(x: Int) { 
     showCount = x 
    } 
} 

class MyObserver: NSObject { 
    var objectToObserve = ShowDirectory() 
    override init() { 
     super.init() 
     objectToObserve.addObserver(self, forKeyPath: "showCount", options: .New, context: &myContext) 
    } 

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
     if context == &myContext { 
      if let newValue = change?[NSKeyValueChangeNewKey] { 
       print("\(newValue) shows were added") 
      } 
     } else { 
      super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
     } 
    } 

    deinit { 
     objectToObserve.removeObserver(self, forKeyPath: "myDate", context: &myContext) 
    } 
} 

, ben dizideki öğelerin sayısına eşittir showCount set, ancak teselli için "X gösterileri eklendi" yazdırmıyor . ViewDidLoad() işlevim, yalnızca diziye öğe ekleyen işlevi ve şu anda başka hiçbir şeyi çağırmaz.

+0

bu sorunu yeniden olamaz. İşte benim (bir oyun alanından) benim gist: https://gist.github.com/rnapier/f3354765347631b1208892fe30e0fd31 "2 gösterir eklendi." Yazdırır. Sorunu gösteren tam kodunuzu gönderebilir misiniz? –

cevap

0
o Apple Docs Bkz NSObject

alt sınıf ve

Sen gözlemleyerek anahtar değerini kullanabilirsiniz "Gözlem Anahtar Değeri" aramaz gibi maalesef bir Int için gözlemci olarak ekleyemezsiniz

sınıf, NSObject sınıfından miras aldığı sürece bir Swift sınıfı ile.

Aksi takdirde, KVO kazan plaka kodunuz bana iyi gelir.

senin dizinin içeriğini değiştirdiğinizde bildirilmesini istiyorsanız, @ Paul Patterson tavsiye ettiğinin deneyebilirsiniz ve use a proxy object

İlgili konular