💬 문제 상황
아래 코드에서는 사용자 입력에 의해 텍스트 필드의 값이 변경될 때만 감지할 수 있다. 즉, 외부에서 textField.text = “지연”처럼 텍스트 필드의 값을 직접 변경할 경우 이를 감지하지 못한다.
textField.addTarget(
self,
action: #selector(handleTextFieldEditingChanged),
for: .editingChanged
)
💛✨ 해결 방법
Combine을 활용해서 아래와 같이 (1)외부에서의 텍스트 변경과 (2)텍스트필드 입력으로 인한 변경 모두를 감지할 수 있는 Publisher 정의했다.
extension UITextField {
public var textDidChangePublisher: AnyPublisher<String, Never> {
Publishers.Merge(
// UITextField의 text 속성에 대한 KVO Publisher를 생성하여 외부에서의 텍스트 변경 감지
publisher(for: \.text).compactMap { $0 },
// UITextField의 텍스트가 변경될 때 발생하는 Notification을 구독하여, 사용자 입력에 의한 텍스트 변경을 감지
NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification)
.compactMap { ($0.object as? UITextField)?.text }
)
.removeDuplicates()
.eraseToAnyPublisher()
}
}
참고로 사용 예시는 다음과 같다.
textField.textDidChangePublisher
.sink { newText in
// 텍스트 변경 처리
print("New text: \(newText)")
}
.store(in: &cancellables)
'iOS 🍎 Swift' 카테고리의 다른 글
UIBackgroundModes Capability 추가하기 (0) | 2024.10.28 |
---|---|
Xcode 메모리 누수 체크하기 (2) | 2024.08.05 |
Github OAuth 앱 스토어 심사 (iOS에서 URL을 여는 방법) (8) | 2024.07.18 |
iOS 민감한 정보 숨기기 (0) | 2024.07.18 |
타겟 간 같은 Realm 저장소 사용하기 (feat. Tuist) (0) | 2024.07.18 |