From da84091bb895af6217439abb2a0fc433458c7224 Mon Sep 17 00:00:00 2001 From: seuriseuljjeok Date: Tue, 28 May 2024 18:04:28 +0900 Subject: [PATCH] =?UTF-8?q?[Refactor]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EB=B7=B0=20MVVM=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20(#7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 18 +++++++-- .../Scene/Login/View/LoginView.swift | 33 ++++++----------- .../Login/ViewModel/LoginViewModel.swift | 37 ++++++++++++++++++- .../ViewControllers/MainViewController.swift | 2 +- 4 files changed, 63 insertions(+), 27 deletions(-) diff --git a/Tving_CloneProject/Tving_CloneProject.xcodeproj/project.pbxproj b/Tving_CloneProject/Tving_CloneProject.xcodeproj/project.pbxproj index 72c5934..1ed586f 100644 --- a/Tving_CloneProject/Tving_CloneProject.xcodeproj/project.pbxproj +++ b/Tving_CloneProject/Tving_CloneProject.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ CA3953222BC6FA9F00B15E91 /* Constant.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA3953212BC6FA9F00B15E91 /* Constant.swift */; }; CA3953252BC6FB1100B15E91 /* ScreenUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA3953242BC6FB1100B15E91 /* ScreenUtils.swift */; }; CA3BA70F2BFE7E9800F77616 /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA3BA70E2BFE7E9800F77616 /* MainViewModel.swift */; }; + CA803D982C05B977006B8C35 /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA803D972C05B977006B8C35 /* LoginViewModel.swift */; }; CA8496E22BE7E36D0064E0CC /* Moya in Frameworks */ = {isa = PBXBuildFile; productRef = CA8496E12BE7E36D0064E0CC /* Moya */; }; CA8496E52BE7E54D0064E0CC /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA8496E42BE7E54D0064E0CC /* Config.swift */; }; CA8496E72BE7E8E60064E0CC /* GetMovieResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA8496E62BE7E8E60064E0CC /* GetMovieResponseModel.swift */; }; @@ -90,6 +91,7 @@ CA3953212BC6FA9F00B15E91 /* Constant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constant.swift; sourceTree = ""; }; CA3953242BC6FB1100B15E91 /* ScreenUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenUtils.swift; sourceTree = ""; }; CA3BA70E2BFE7E9800F77616 /* MainViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewModel.swift; sourceTree = ""; }; + CA803D972C05B977006B8C35 /* LoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; CA8496E42BE7E54D0064E0CC /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; CA8496E62BE7E8E60064E0CC /* GetMovieResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetMovieResponseModel.swift; sourceTree = ""; }; CA8496E92BE89A840064E0CC /* BaseTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTargetType.swift; sourceTree = ""; }; @@ -305,7 +307,8 @@ CA3953262BC6FC0E00B15E91 /* Login */ = { isa = PBXGroup; children = ( - CA3953292BC6FC3D00B15E91 /* Views */, + CA803D962C05B959006B8C35 /* ViewModel */, + CA3953292BC6FC3D00B15E91 /* View */, CA3953282BC6FC2C00B15E91 /* ViewControllers */, ); path = Login; @@ -328,12 +331,12 @@ path = ViewControllers; sourceTree = ""; }; - CA3953292BC6FC3D00B15E91 /* Views */ = { + CA3953292BC6FC3D00B15E91 /* View */ = { isa = PBXGroup; children = ( CA39531F2BC6F6BE00B15E91 /* LoginView.swift */, ); - path = Views; + path = View; sourceTree = ""; }; CA39532A2BC6FC6A00B15E91 /* ViewControllers */ = { @@ -352,6 +355,14 @@ path = ViewModel; sourceTree = ""; }; + CA803D962C05B959006B8C35 /* ViewModel */ = { + isa = PBXGroup; + children = ( + CA803D972C05B977006B8C35 /* LoginViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; CA8496DA2BE7D6550064E0CC /* Network */ = { isa = PBXGroup; children = ( @@ -549,6 +560,7 @@ CA3953192BC47D3300B15E91 /* UILabel+.swift in Sources */, CA902ECA2BDB8E5C00560D26 /* HeaderCategoryView.swift in Sources */, CA902EC82BDB8D3900560D26 /* UnderlineSegmentedControlView.swift in Sources */, + CA803D982C05B977006B8C35 /* LoginViewModel.swift in Sources */, CAB6E7EC2C0485E300E49F9E /* DailyBoxOfficeCell.swift in Sources */, CA3953172BC45DA300B15E91 /* UIFont+.swift in Sources */, CA3952E82BC31F9900B15E91 /* SceneDelegate.swift in Sources */, diff --git a/Tving_CloneProject/Tving_CloneProject/Scene/Login/View/LoginView.swift b/Tving_CloneProject/Tving_CloneProject/Scene/Login/View/LoginView.swift index 083292f..9bb8d82 100644 --- a/Tving_CloneProject/Tving_CloneProject/Scene/Login/View/LoginView.swift +++ b/Tving_CloneProject/Tving_CloneProject/Scene/Login/View/LoginView.swift @@ -38,6 +38,8 @@ class LoginView: UIView { weak var delegate: LoginViewDelegate? + private let loginViewModel: LoginViewModel = LoginViewModel() + // MARK: - Life Cycles @@ -85,7 +87,6 @@ private extension LoginView { } func setStyle() { - self.backgroundColor = UIColor(resource: .black) idTextField.do { @@ -201,17 +202,17 @@ private extension LoginView { @objc func textFieldChange() { - let id = self.idTextField.text ?? "" - let pw = self.pwTextField.text ?? "" + let id = self.idTextField.text + let pw = self.pwTextField.text - if !id.isEmpty { + if loginViewModel.checkId(id: id) { idClearButton.isHidden = false } else { pwClearButton.isHidden = false maskButton.isHidden = false } - setLoginButton(isEnabled: !id.isEmpty && !pw.isEmpty) + setLoginButton(isEnabled: loginViewModel.checkValid(id: id, pw: pw)) } @objc @@ -222,9 +223,9 @@ private extension LoginView { @objc func clearButtonTapped(_ sender: UIButton) { if sender.tag == 0 { - self.idTextField.text = "" + self.loginViewModel.clearText(textfield: self.idTextField) } else { - self.pwTextField.text = "" + self.loginViewModel.clearText(textfield: self.pwTextField) } setLoginButton(isEnabled: false) } @@ -244,23 +245,11 @@ private extension LoginView { extension LoginView: UITextFieldDelegate { func textFieldDidBeginEditing (_ textField: UITextField) { - - if textField.placeholder == "아이디" { - self.idTextField.layer.borderWidth = 1 - self.idTextField.layer.borderColor = UIColor(resource: .grey2).cgColor - } else { - self.pwTextField.layer.borderWidth = 1 - self.pwTextField.layer.borderColor = UIColor(resource: .grey2).cgColor - } - + textField.layer.borderWidth = 1 + textField.layer.borderColor = UIColor(resource: .grey2).cgColor } func textFieldDidEndEditing(_ textField: UITextField) { - - if textField.placeholder == "아이디" { - self.idTextField.layer.borderWidth = 0 - } else { - self.pwTextField.layer.borderWidth = 0 - } + textField.layer.borderWidth = 0 } } diff --git a/Tving_CloneProject/Tving_CloneProject/Scene/Login/ViewModel/LoginViewModel.swift b/Tving_CloneProject/Tving_CloneProject/Scene/Login/ViewModel/LoginViewModel.swift index 4fc7ac2..1d7fbda 100644 --- a/Tving_CloneProject/Tving_CloneProject/Scene/Login/ViewModel/LoginViewModel.swift +++ b/Tving_CloneProject/Tving_CloneProject/Scene/Login/ViewModel/LoginViewModel.swift @@ -5,4 +5,39 @@ // Created by 윤희슬 on 5/28/24. // -import Foundation +import UIKit + +final class LoginViewModel { + + // MARK: - Properties + + var errMessage: String = "" +} + +extension LoginViewModel { + + func checkValid(id: String?, pw: String?) -> Bool { + guard let id else { + errMessage = "아이디를 입력해주세요" + return false + } + + guard let pw else { + errMessage = "비밀번호를 입력해주세요" + return false + } + + return true + } + + func checkId(id: String?) -> Bool { + guard let id else { + return false + } + return true + } + + func clearText(textfield: UITextField) { + textfield.text = "" + } +} diff --git a/Tving_CloneProject/Tving_CloneProject/Scene/Main/ViewControllers/MainViewController.swift b/Tving_CloneProject/Tving_CloneProject/Scene/Main/ViewControllers/MainViewController.swift index 432465d..45579f2 100644 --- a/Tving_CloneProject/Tving_CloneProject/Scene/Main/ViewControllers/MainViewController.swift +++ b/Tving_CloneProject/Tving_CloneProject/Scene/Main/ViewControllers/MainViewController.swift @@ -10,7 +10,7 @@ import UIKit import SnapKit import Then -class MainViewController: UIViewController { +final class MainViewController: UIViewController { // MARK: - UI Properties