iOS

[Swift/ TIL #5] - 23/10/18 - .editingChanged

dev_강건 2023. 10. 19. 01:03

안녕하세요! 오늘은 계속 만들던 프로젝트를 완성했습니다.

(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로 연결된 함수는 사용자에 의한 동작에만 작동한다.