이 글은 공부한 내용을 정리하는 글로 건전한 비판은 언제든 환영합니다.
ViewModel이란?
간단히 말하면 ViewModel이란 view의 UI상태를 담당하기 위해 만들어진 클래스이다.
자세한 내용은 MVVM패턴에 대해서 설명한 내용이 있으니 참고하시면 좋겠습니다/
https://luca-os.tistory.com/m/61
그래서 어떻게 ViewModel을 이용하여 버튼을 활성화 할까?
먼저 스토리 보드는 간단하게 email, password, button 방식으로 구성하였고
프로퍼티 및 액션은
이렇게 작성하였습니다.
ViewModel 작성하기
먼저 ViewModel이라는 파일을 작성하여서 TextField와 관련된 프로퍼티를 작성하여 줍니다.
//
// ViewModel.swift
// ViewModelBtnActivate
//
// Created by Mac on 2022/10/18.
//
import UIKit
struct loginViewModel{
var email:String?
var password:String?
}
그리고 프로토콜을 하나 작성하여 줍니다.
import UIKit
protocol Authentication{
var formIsValid:Bool {get}
var buttonBackgroundColor:UIColor {get}
}
그리고 위에서 구조체로 만들었던 곳에 상속을 받아주게 되면,
이렇게 에러가 발생하게 됩니다. 그 이유는 상속을 받았기 때문에 구현을 해주어야 합니다.
그래서
struct loginViewModel: Authentication{
var email:String?
var password:String?
var formIsValid: Bool{
return email?.isEmpty == false && password?.isEmpty == false
}
var buttonBackgroundColor: UIColor{
return formIsValid ? #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) : #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1).withAlphaComponent(0.5)
}
}
위와 같이 작성하게 된다면, email과 password가 비어있지 않다면 true를 출력할 것이며 formIsValid를 기준으로 buttonBackground color도 바뀌게 됩니다.
그리고 protocol을 하나 더 만들어 주겠습니다.
protocol FormViewModel{
func update()//추가
}
protocol Authentication{
var formIsValid:Bool {get}
var buttonBackgroundColor:UIColor {get}
}
ViewController
다시 ViewController로 돌아와서 작성해준 viewModel을 프로퍼티로 만들어 줍니다.
class ViewController: UIViewController {
private var viewModel:loginViewModel()//추가
그리고 extension하여서, 아까 viewModel에서 만든 protocol을 상속 받아줍니다.
그리고 viewModel을 이용하여 버튼에 색상이나 활성화를 바꿔줍니다.
extension ViewController:FormViewModel{
func update() {
btnProperty.backgroundColor = viewModel.buttonBackgroundColor
btnProperty.isEnabled = viewModel.formIsValid
}
}
그리고 ViewController에서 action을 하나 만들어 줍니다.
@objc func btnActivate(sender: UITextField){
if sender == emailTextField{
viewModel.email = sender.text
}else{
viewModel.password = sender.text
}
update()
}
UITextField에서 입력을 받으면 viewModel로 들어가게 됩니다.
그래서 viewModel에서 작성한 함수를 가지고 넣을 수 있게 작성합니다.
그리고 액션을 받은 것들을 각 TextField에서 받은 addTarget으로 넣어주게 됩니다.
func configureObservable(){
emailTextField.addTarget(self, action: #selector(btnActivate), for: .editingChanged)
passwordTextField.addTarget(self, action: #selector(btnActivate), for: .editingChanged)
}
그리고 이 작성한 함수를 viewDidLoad에 넣어주게 된다면
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
configureObservable()
}
작동할 수 있습니다.
빈칸일때
TextField를 작성하였을 때
'Mobile > IOS' 카테고리의 다른 글
Static Framework, Dynamic Framework (0) | 2023.11.15 |
---|---|
iOS 커스텀 프레임워크 만들기 (0) | 2023.09.18 |
Objective-c xml 파싱, json 파싱 (0) | 2022.08.21 |
DispatchQueue (0) | 2022.07.01 |
CocoaPods 에러 Cannot find 'Auth' in scope (0) | 2022.05.04 |