【问题标题】:Swift MVVM Binding (Using Boxing)Swift MVVM 绑定(使用装箱)
【发布时间】:2017-11-20 09:28:24
【问题描述】:

我正在尝试使用Boxing 实现 MVVM 架构模式。我只是通过添加拳击类来完成它:

class Dynamic<T> {
typealias Listener = (T) -> Void
var listener: Listener?

func bind(listener: Listener?) {
    self.listener = listener
}

func bindAndFire(listener: Listener?) {
    self.listener = listener
    listener?(value)
}

var value: T {
    didSet {
        listener?(value)
    }
}

init(_ v: T) {
    value = v
}}

然后在 ViewController 中我引用了一个 ViewModel,这是我的 View Controller:

class SignUpViewController: UIViewController {

// UI Outlets
@IBOutlet weak var emailLoginTextField: FloatLabelTextField!
@IBOutlet weak var passwordLoginTextField: FloatLabelTextField!

var viewModel = AuthenticationViewModel()


override func viewDidLoad() {
    super.viewDidLoad()
    
    viewModel.user.email.bind{
        
        self.emailLoginTextField.text = $0
        
    }
    
}}

这是我的视图模型:

class AuthenticationViewModel{

let defaults = UserDefaults.standard

let serviceManager = ServiceManager()

var user = User()
func signupUser(email : String?, password: String?){
    
    
    let parameters : [String:String] = ["email":emailField, "password": password!, "system": "ios"]
    
    serviceManager.initWithPOSTConnection(server: Utitlites.getServerName(), parameters: parameters, methodName: "/api/user/register", completion: { (responseData , errorMessage) -> Void in
        
        let json = (responseData as AnyObject) as! JSON
        
        print(json)
        
        if ErrorHandling.handleErrorMessage(responseData: responseData).0 ==  true {
            
            self.defaults.set("userId", forKey: json["user"]["id"].stringValue)
            
            //self.userId.value = json["user"]["id"].stringValue
            
            self.user = User(json: json)
            
            
            
            
        }
        
    })
    
}}

这是我的模型:

class User{

var id = Dynamic("")
var name = Dynamic("")
var email = Dynamic("")

init(){
    
}

init(json: JSON){
    
    id.value = json["user"]["id"].stringValue
    email.value = json["user"]["email"].stringValue
    
}}

我的问题是:

MVVM 架构明智,在 ViewController 中使用此行访问模型是否正确:

viewModel.user.email.bind{

    self.emailLoginTextField.text = $0

}

因为我现在可以看到视图正在访问模型,我认为这不是 MVVM 所代表的。我需要有人澄清

【问题讨论】:

    标签: ios swift mvvm


    【解决方案1】:

    解决这个问题的最佳实践 (imo) 并根据这个 raywanderlich video 31:18 是实际上将 Model 设置为私有,您的 VC 根本不需要知道它,只有ViewModel

    之后,像这样在ViewModel 中为Model 设置getter:

    var id: Dynamic<String> = Dynamic("")
    var name: Dynamic<String> = Dynamic("")
    var email: Dynamic<String> = Dynamic("")
    

    然后,在您的 ViewModel 中,也将 User 对象设置为具有 didSet 通知程序,该通知程序将相应地更新 ViewModel 的数据:

    private var user = User() {
        didSet {
            id = user.id
            name = user.name
            email = user.email
        }
    }
    

    现在,您只能从ViewModel 而不是直接从Model 访问这些属性:

    viewModel.email.bind{
        self.emailLoginTextField.text = $0
    }
    

    哦,别忘了将Model 上的属性设置为普通字符串;)

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2014-02-14
      • 2013-11-07
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 2011-01-18
      • 1970-01-01
      相关资源
      最近更新 更多