TextField 동작 개선하기 ‐ 최진원 - Team-HGD/SniffMEET GitHub Wiki
작업 내역
백로그
Nickname TextField
현재: Delegate 기반 동작
extension ProfileCreateViewController: UITextFieldDelegate {
func textFieldDidChangeSelection(_ textField: UITextField) {
guard let textCount = textField.text?.count else { return }
submitButton.isEnabled = (textCount > 1 && textCount < 9 )
}
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
guard let text = textField.text else { return false }
let newLength = text.count + string.count - range.length
let inputTextValid = newLength <= 15
return inputTextValid
}
}
delegate 메소드를 사용하여 텍스트 필드가 입력될 때 마다 닉네임 필드 길이의 유효성을 판별하는 방식
하지만, 텍스트가 입력 될 때마다 닉네임이 유효한지 검사하기는 힘듦 → 네트워크 요청이 너무 많아질 것이기 때문에
케이스 나눠보기
UIControl
의 퍼블리셔가 이미 프로젝트 내부에 있기 때문에, UITextLabel
도 combine을 사용할 수 있습니다.
반응성이 매우 좋은 방식
새로운 입력이 들어올 때 마다, 그 입력이 유효한지 확인하는 방식, 실시간으로 현재 닉네임이 유효한지 체크하고 현재 상황을 TextLabel에 표시한다.
- delegate만 써서도 가능
- 네트워크 요청이 매우 많아짐
debounce
나 throttle
로 적당히 조절하기
길이는 입력이 들어올 때 마다 검증, 중복체크는 여기서부턴 delegate와 Combine을 조합해야 합니다. 길이 체크는 기존 방식을 유지하되, 닉네임을 검증하고 중복을 체크하는 것은 Combine을 사용합니다. 하지만 두 가지 프레임워크가 중복되므로, 생각해야 할 부분이 많아집니다.
텍스트 편집이 끝났을 때 중복 체크하기
delegate 메소드만 사용해서 가능합니다. 하지만 반응성이 좋다고 볼 수는 없습니다.
모든 것을 컴바인으로 처리하기
중복 체크, 닉네임 길이 검증을 다 컴바인으로 처리합니다. submitButton
은 zip
으로 활성화 할지 결정하면 됩니다.
결론
일단 현재는 Delegate를 사용하여 처리하도록 했습니다.(사용성에는 문제가 없습니다.)
추후 팀 내부에서 논의를 거친 후에 리팩토링이 필요하다고 판단되면 리팩토링을 진행하면 좋을 것 같습니다.