ViewController가 `ViewModel과 View의 중간자 역할을 담당해서 View에게 delegate로 ViewModel의 닉네임 조건 로직을 전달함.
View는 전달받은 delegate의 로직을 textfield에 addTarget하여서 실시간으로 변하는 textfield에 대응한 로직의 결과를 statusLabel에 표시함
⇒ View, ViewModel, ViewController를 분리하여 MVVM 패턴의 관심사 분리 원칙을 지키고자함.
[x] 프로필 이미지 영역 클릭시 [프로필 이미지 설정 화면] push
[x] [프로필 이미지 설정 화면] 에서 [<] 클릭시 [프로필 닉네임 설정 화면]으로 pop되면서 선택 프로필 반영
delegate와 custom leftBarButtonItem을 통해서 전달
[x] [메인 화면] 전환 및 사용자 정보 저장
WindowRootViewController 가 [메인화면]으로 교체
[x] [온보딩 화면] 전환
UserDafault의 private enum UserDefaultsKeys 을 활용하여 연산 프로퍼티로 활용
UserDefault의 유무로 전환할 화면을 구분함
TROUBLE SHOTTING
navigationItem의 backBarButtonItem을 수정하여 addTarget을 하려고 했으나 실패함.
A화면에서 B화면으로의 화면전환이 일어날 때, backBarButtonItem을 설정하는 곳은 이전 화면인 A화면에서 설정하기 때문에 B화면에있는 데이터를 직접 전달할 수 있는 방법이 없다.
애초에 A에서 backBarButtonItem에 대한 action을 커스텀할 수 없기 때문에 Delegate를 통해 B의 데이터 값을 받아오려고 해도 실행되지 않는 문제가 있었다.
backBarButtonItem 대신 Custom leftBarButtonItem을 사용하였다.
A화면에서 B화면으로의 화면전환이 일어날 때, B화면에서 leftBarButtonItem을 설정하기 때문에, B화면이 pop되어 A화면으로 돌아갈 때 A의 Delegate 메서드를 호출하여 B화면의 데이터를 매개변수로 담아 A에 전달할 수 있다.
// B
final class ProfileImageSettingViewController: UIViewController {
weak var delegate: ProfileSettingDelegate?
구현 사항
ViewModel
이 닉네임 조건 로직을 가지고 있고,ViewController
가`ViewModel
과View
의 중간자 역할을 담당해서 View에게delegate
로 ViewModel의 닉네임 조건 로직을 전달함.View, ViewModel, ViewController를 분리
하여MVVM 패턴의 관심사 분리 원칙
을 지키고자함.delegate
와custom leftBarButtonItem
을 통해서 전달WindowRootViewController
가 [메인화면]으로 교체private enum UserDefaultsKeys
을 활용하여연산 프로퍼티
로 활용TROUBLE SHOTTING
navigationItem
의backBarButtonItem
을 수정하여 addTarget을 하려고 했으나 실패함.A화면
에서 설정하기 때문에B화면
에있는 데이터를 직접 전달할 수 있는 방법이 없다.backBarButtonItem
대신Custom leftBarButtonItem
을 사용하였다.B화면
에서 leftBarButtonItem을 설정하기 때문에, B화면이 pop되어 A화면으로 돌아갈 때 A의 Delegate 메서드를 호출하여 B화면의 데이터를 매개변수로 담아 A에 전달할 수 있다.private func configureUI() { navigationItem.title = "PROFILE SETTING" navigationItem.leftBarButtonItem = BlackLeftBarButtonItem( action: #selector(navigationBackButtonItemTapped), target: self) }
@objc private func navigationBackButtonItemTapped() { delegate?.getSelectedProfile(viewModel.profileImage.value) navigationController?.popViewController(animated: true) } }
// A extension ProfileSettingViewController: ProfileSettingDelegate {
}