iOS에서 조건에 의한 버튼 비활성화 구현 질문있습니다.

조회수 1666회

안녕하세요. 비밀번호 텍스트 필드에 4글자부터 로그인 버튼이 활성화 되도록 구현 중입니다.


func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if passwordField.text!.count < 3 || (range.location == 3 && range.length == 1)  {
            loginButton.isEnabled = false
        } else {
            loginButton.isEnabled = true
        }
        print(passwordField.text!, range.location, range.length) // 이 부분은 확인을 위해 만든 부분입니다.
        return true
    }

이렇게 해서 비밀번호 필드가 4자리부터 버튼이 활성화되게 했습니다.

range.location 과 range.length는 NSRange 특성상 문자를 지웠을 때 대비해서 조건에 넣었습니다.

그런데 저 아리송한 메서드 떄문에 궁금한 점이 몇가지 생겼습니다.

1) 보통 문자열의 count는 1부터 시작아닌가요? 이 메서드에서는 왜 count가 0부터 시작일까요? NSRange 타입의 매개변수 때문인가요?

2) TextField의 문자가 2개에서 3개로 늘어날 때는 비활성화 상태인데(이게 정상이죠) 3개에서 2개로 지워질 때 갑자기 활성화가 됩니다.

왜 그럴까요? print로 로그를 찍어보면 location 부분이 2이고, length 부분이 1이니까 if문을 만족해서 비활성화가 되어야 하는 것 아닌가요?

3) 가장 중요한 질문입니다. 굳이 이렇게까지 해서 Password Validation을 만들어야 하나요..? ㅋㅋㅋ 진짜 이 개념 알기전까지 6시간 삽질 한 것 같습니다.

다른 쉬운 방법이 분명 존재할 것 같은데.. 다른 방법 있다면 좀 알려주시면 감사하겠습니다. ㅠㅠㅠ

제가 글 재주가 없어 중구난방으로 질문한 것 같은데 질문이 이해가 안가시거나 제가 놓치고 있는게 있으시면 좀 알려주시면 감사하겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • textField(_:shouldChangeCharactersIn:replacementString:) 은 textfield의 text가 변경되기 전에 호출됩니다. boolean 으로 변경을 반영 할 것인지 반환하는 용도 이기 때문인데요. 그래서 1, 2번의 문제들이 발생 하는 겁니다.

    단순 길이체크를 하신다면 UIControl.Event.editingChanged 를 이용하세요. UITextView의 textViewDidChange(_:)처럼 이용 하면 됩니다.

    꼭 shouldChangeCharacters로 처리해야한다면 textfield의 text를 매개변수를 이용해 NSString.replaceCharactersInRange 로 리플레이스 해서 이용하시면 됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)