【发布时间】:2018-05-22 16:43:39
【问题描述】:
我正在尝试使用 MVVM。在阅读了一些关于 MVVM 的博客后,我发现它们使用了 Rx、KVO、Boxing 等数据绑定技术。以下是我使用 MVVM 验证用户的类。我没有为数据绑定添加任何代码。我所做的只是在单击提交按钮时将用户名和密码从视图控制器传递给我的视图模型类。视图模型包含验证的所有逻辑。最后,它将状态返回给视图控制器,具体取决于视图控制器显示的一些消息。我在徘徊这是要走的路还是应该使用一些数据绑定?
SignUpViewController.swift
import UIKit
class SignUpViewController: UIViewController {
let signupviewmodel = SignUpViewModel()
@IBOutlet weak var textFieldUsername: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBOutlet weak var textFieldPasswordConfirm: UITextField!
@IBAction func initialSignUp(_ sender: Any) {
signupviewmodel.updateUsername(username: textFieldUsername.text!)
signupviewmodel.updatePassword(password: textFieldPassword.text!)
signupviewmodel.updateConfirmPassword(confirmpassword: textFieldPasswordConfirm.text!)
switch signupviewmodel.validateUser() {
case .Valid:
showAlert(title: "Valid", message: "success")
case .InValid(let error):
showAlert(title: "Error Validation", message: error)
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func showAlert(title: String, message: String) -> Void {
let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
SignUpViewModel.swift
import Foundation
enum UserValidationState {
case Valid
case InValid(String)
}
class SignUpViewModel {
private let minPasswordLength: Int = 6
private var user = User()
var username: String {
return user.username!
}
var password: String {
return user.password!
}
var confirmpassword: String {
return user.confirmpassword!
}
}
extension SignUpViewModel {
func updateUsername(username: String) {
user.username = username
}
func updatePassword(password: String) {
user.password = password
}
func updateConfirmPassword(confirmpassword: String) {
user.confirmpassword = confirmpassword
}
func validateUser() -> UserValidationState {
if (username.isBlank || password.isBlank || confirmpassword.isBlank) {
return .InValid("Please fill all the fields")
} else {
if isNumber(username: username) {
if isValidPhone(phone: username) {
if isValidPasswordLength(password: password) {
if passwordsMatch(password: password, confirmpassword: confirmpassword) {
return .Valid
}
return .InValid("Passwords do not match")
}
return .InValid("Password length doesn't meet criteria")
}
return .InValid("InValid Phone")
} else {
if isValidEmail(email: username) {
if isValidPasswordLength(password: password) {
if passwordsMatch(password: password, confirmpassword: confirmpassword) {
return .Valid
}
return .InValid("Passwords do not match")
}
return .InValid("Password length doesn't meet criteria")
}
return .InValid("InValid Email")
}
}
}
func isValidEmail(email:String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format:"SELF MATCHES %@", emailRegEx).evaluate(with: email)
}
func isValidPhone(phone: String) -> Bool {
return true
}
func isBlank(text: String) -> Bool {
return text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
}
func isValidPasswordLength(password: String) -> Bool {
guard password.count < minPasswordLength else {
return true
}
return false
}
func passwordsMatch(password: String, confirmpassword: String) -> Bool {
guard password == confirmpassword else {
return false
}
return true
}
func isNumber(username: String) -> Bool {
guard let _ = Int(username) else {
return false
}
return true
}
}
用户.swift
import Foundation
struct User {
var username: String?
var password: String?
var confirmpassword: String?
}
【问题讨论】:
标签: ios swift mvvm data-binding