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 로 리플레이스 해서 이용하시면 됩니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력