2017-06-28 20 views
2

Ich versuche, ein einfaches mvvm Modell erstellen kvoEinfacher MVVM mit KVO

Mein Ziel besteht darin, wenn die UITextField Textänderungen automatisch den Text UILabel ändern. Aber aus irgendeinem Grund die observeValue Funktion nicht

import UIKit 
class ViewController: UIViewController, UITextFieldDelegate { 

    var viewModel : TestViewModel? 
    @IBOutlet weak var LBLABEL: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     viewModel = TestViewModel() 

     addObserver(self, forKeyPath: #keyPath(viewModel.infoText), options: [.old, .new], context: nil) 

     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     viewModel?.infoText = textField.text 
     return true 
    } 


    // MARK: - Key-Value Observing 
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
     if keyPath == "info" { 
      // Update Time Label 
      LBLABEL.text = viewModel?.infoText 
     } 
    } 

} 


class TestViewModel : NSObject{ 
    var model : TestModel 

    var infoText:String? { 
     didSet{ 
      model.info = self.infoText 

     } 
    } 

    override init() { 
     model = TestModel() 
    } 
} 


class TestModel { 
    var info:String? 
} 

Ich habe bereits versucht genannt wird der Beobachter Erklärung zu ändern oder sogar die Ansichtsmodell bekommt und Sets und es gelang ihm nie

+0

Haben Sie 'textField.delegate = self' irgendwo in Ihrem Code hinzugefügt? –

+0

@Ahmad F - ja. im Storyboard. Ich habe einige Breakpoints auf 'shouldChangeCharactersIn' gesetzt und der Code ist dort stehengeblieben. Der Wert der Strings im Modell und Viewmodel wurde korrekt geändert – Pedro

Antwort

1

UPDATE

Laut Apple docs wird 4.

class MyObserver: NSObject { 
    @objc var objectToObserve: MyObjectToObserve 
    var observation: NSKeyValueObservation? 

    init(object: MyObjectToObserve) { 
     objectToObserve = object 
     super.init() 

     observation = observe(\.objectToObserve.myDate) { object, change in 
      print("Observed a change to \(object.objectToObserve).myDate, updated to: \(object.objectToObserve.myDate)") 
     } 
    } 
} 

let observed = MyObjectToObserve() 
let observer = MyObserver(object: observed) 

observed.updateDate() 
in Swift viel einfacher sein, einen Beobachter für den Schlüsselpfad zu schaffen

Sie müssen dynamic zu den Eigenschaften der NSObject Unterklasse hinzufügen, die Sie beobachten möchten. In Ihrem Fall:

@objc dynamic var infoText:String? { 
    didSet{ 
     model.info = self.infoText    
    } 
} 

Btw, ich weiß nicht, warum du dir Textfield wollen: shouldChangeCharactersIn da es den Wert Textfeld wird weiter aktualisiert. Auch keyPath == "info" wird niemals wahr sein. Sollte es nicht etwas anderes sein? Zum Beispiel keyPath == "viewModel.infoText"?

+0

Dank der '@objc dynamic' wurde aufgelöst: D – Pedro