This question might seem basic, yet I am posting it to get suggestions.
Following is a sample login module using MVVM pattern.
The viewcontroller code is as follows.
class ViewController: UIViewController {
private var loginviewmodel = LoginViewModel()
@IBOutlet weak var textFieldUserName: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBAction func signIn(_ sender: Any) {
//CASE 1
loginviewmodel.performLogin(name: textFieldUserName.text!, pwd: textFieldPassword.text!)
//CASE 2
//loginviewmodel.performLogin()
}
override func viewDidLoad() {
super.viewDidLoad()
textFieldUserName.delegate = self
textFieldPassword.delegate = self
}
}
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
switch textField {
case textFieldUserName:
loginviewmodel.updateUsername(inputText: inputText)
case textFieldPassword:
loginviewmodel.updatePassword(inputText: inputText)
default:
return false
}
return true
}
}
And the viewmodel code is as follows.
class LoginViewModel {
var userName: String?
var password: String?
func updateUsername(inputText: String) {
self.userName = inputText
}
func updatePassword(inputText: String) {
self.password = inputText
}
func performLogin() {
print("Login successful with username = \(userName) and password = \(password).")
}
func performLogin(name: String, pwd: String) {
print("Login successful with username = \(name) and password = \(pwd).")
}
}
I have two cases in which the values get passed from viewcontroller to viewmodel differently.
The first case in which the texts are passed directly as function parameters
The second case, in which the texts are passed via text delegate method
Which would be the preferred way here?