안녕하세요! 오늘은 계속 만들던 프로젝트를 완성했습니다.
(https://github.com/kangsworkspace/BMI-MVVM)
예제에 대한 로직만 분석하면서 MVVM 패턴에 대해 이해하느라 이전처럼 특별히 정리할만한 내용은 없었습니다.
그래도 다 아시겠지만! 별 거 아닐 수 있는 개념을 조금 정리해보자면!
함수를 연결할 때 흔히 쓰는 메서드
.addTarget(target: Any?, action: Selector, for: UIControl.Event)
의 파라미터 UIControl.Event 타입인 .editingChanged에 대해섭니다.
프로젝트의 코드 중에 이런 맥락의 코드가 있습니다.
1. 텍스트 필드에 .addTarget 메서드를 이용해서 텍스트 필드가 수정될 때마다 동작할 함수를 연결
heightTextField.addTarget(self, action: #selector(textFieldChanged(_:)), for: .editingChanged)
2. 연결된 함수는 뷰 모델에 텍스트 필드의 텍스트를 저장
@objc func textFieldChanged(_ textField: UITextField) {
viewModel.setHeightValue(textField.text ?? "")
}
텍스트가 수정되면 뷰 모델에 저장하도록 하는 간단한 내용인데
다음 코드 때문에 의문이 생기는 부분이 있었습니다. (계산하기 버튼을 누르면 동작하는 함수)
@objc func calculateButtonTapped() {
// 화면 이동전에 인터페이스 초기화
heightTextField.text = ""
weightTextField.text = ""
// 뷰 모델의 계산하기 로직 실행
viewModel.calculateButtonTapped(fromCurrentVC: self, animated: true)
}
어? 텍스트가 "" 로 수정되었는데 그럼 뷰 모델에 수정된 데이터를 전달하는 함수가 실행되고
"" 로 수정된채로 계산하는 함수가 실행되는 것이 아닌가?
그러면 계산하기 함수를 먼저 실행해야 하는거 아닌가?
결론은 상관없다 입니다.
아까 입력한 아래의 코드로 .editingChanged 로 텍스트 필드가 수정되면 함수를 실행하도록 연결했다고 했는데,
heightTextField.addTarget(self, action: #selector(textFieldChanged(_:)), for: .editingChanged)
더 정확히는 사용자에 의해서 텍스트 필드가 수정될 때 함수를 실행하도록 설정하는 것입니다.
그러니까 사용자가 아닌 다른 함수로 텍스트 필드를 수정해도 뷰 모델에 텍스트 필드의 텍스트를 저장하는 함수가 실행되지 않죠.
.
.
.
1줄요약: .editingChanged로 연결된 함수는 사용자에 의한 동작에만 작동한다.