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만 써서도 가능
  • 네트워크 요청이 매우 많아짐

길이는 입력이 들어올 때 마다 검증, 중복체크는 debouncethrottle로 적당히 조절하기

여기서부턴 delegate와 Combine을 조합해야 합니다. 길이 체크는 기존 방식을 유지하되, 닉네임을 검증하고 중복을 체크하는 것은 Combine을 사용합니다. 하지만 두 가지 프레임워크가 중복되므로, 생각해야 할 부분이 많아집니다.

텍스트 편집이 끝났을 때 중복 체크하기

delegate 메소드만 사용해서 가능합니다. 하지만 반응성이 좋다고 볼 수는 없습니다.

모든 것을 컴바인으로 처리하기

중복 체크, 닉네임 길이 검증을 다 컴바인으로 처리합니다. submitButtonzip으로 활성화 할지 결정하면 됩니다.

결론

일단 현재는 Delegate를 사용하여 처리하도록 했습니다.(사용성에는 문제가 없습니다.)

추후 팀 내부에서 논의를 거친 후에 리팩토링이 필요하다고 판단되면 리팩토링을 진행하면 좋을 것 같습니다.