2017-06-28 60 views
2

我试图使用志愿与志愿

我的目标是创建一个简单的模型MVVM MVVM简单就是当的UITextField文本的变化,自动改变的UILabel文本。 但由于某些原因,observeValue功能不叫

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? 
} 

我已经试图改变观察者的声明,甚至视图模型获取并设置和从来没有成功

+0

您是否在代码中的某处添加了'textField.delegate = self'? –

+0

@Ahmad F - 是的。在故事板中。我在'shouldChangeCharactersIn'上放了一些断点,代码停在那里。模型和视图模型中字符串的值被正确更改 – Pedro

回答

1

UPDATE

据苹果docs,创建关键路径的观察者将在Swift 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() 

您需要将dynamic添加到要观察的NSObject子类的属性中。你的情况:

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

顺便说一句,我不知道为什么你要你文本框:shouldChangeCharactersIn,因为它得到之前更新文本字段值。此外,keyPath == "info"永远不会是真的。它不应该是别的东西。例如,keyPath == "viewModel.infoText"

+0

感谢@objc动态确实解决了:D – Pedro