강의를 듣던 도중 UITextFieldDelegate 에 대해서 정리할 일이 생겼다.
사실 나는 노션으로 자잘한 것까지 다 기록해두지만 다른 사람이 볼 수 있는 블로그에는 조금 더 제대로 공부한 내용을 남기고 싶어서 아껴둔 것들이 많았는데 이 내용은 비교적 기초적인 내용으로 간단하게 집고 넘어가면 좋을 것 같아서 글을 썼다. 시작해보자.
먼저 UIKit에서 많은 오브젝트들이 Delegate 패턴을 사용해서 해당 클래스에 대한 동작을 구현하고 있다.
대표적으로 UITextField나 UITableView 같은 오브젝트들이다.
Delegate?
Delegate는 '대리자'라는 뜻이다.
즉 무언가를 대신하는 놈 이라는 뜻이다. 그렇다면 뭘 대신할까?
UITextFieldDelegate, UITableViewDelegate .. 등등 각각의 오브젝트이름을 앞에 붙이는 걸로 봐서는 이 오브젝트들의 어떠한 기능을 대신한다고 말하는 것 같다.
UITextField는 화면에서 ViewController 와 완전히 분리된 독립된객체로, 유저와 직접적인 커뮤니케이션을한다.
이 과정에서 다양한 동작의 케이스가 생긴다.
예를들어,
- 유저가 입력을 시작할때
- 유저의 입력이 시작되고나서
- 입력내용 전체를 삭제할 때
- 한글자 한글자 입력하는 순간
- 키보드의 엔터키가 눌렸을 때
- 유저의 입력이 끝났을 때
등 각각의 상황에서 어떤 동작을 취할 것인지에 대한 케이스를 정의 해줘야하는데
이러한 상황들을 모두 코드로 매번 구현하려면 힘들기 때문에
Delegate에서 이러한 시점 또는 허용 여부를 미리 구현해두었다.
그 중 UITextFieldDelegate에서 주로 사용하는 메서드 들을 정리해보자.
// 텍스트 필드 입력 시작할 때 호출 ( 시작할지 말지 여부 허락 )
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return true
}
// bool 리턴타입이 아니면 보통 ->
// 시점 -
func textFieldDidBeginEditing(_ textField: UITextField) {
print("유저가 텍스트 필드의 입력을 시작했다.")
}
// 텍스트 필드 글자 내용이 ( 한글자 한글자 ) 입력되거나 지워질 때 호출이 되고 (허락)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return true
}
// 텍스트 필드의 엔터키가 눌러지면 다음 동작 허락할 것?
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
return true
}
// 텍스트 필드의 입력이 끝날 때 호출 (끝날지 말지를 허락)
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
return false
}
// 텍스트 필드의 입려깅 실제 끝났을 때 호출 (시점)
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
print("유저가 텍스트 필드의 입력을 끝냈다.")
}
func textFieldShouldClear(_ textField: UITextField) -> Bool {
return true
}
예를 들어 텍스트 필드에서 글자수를 제한하고 싶다면
// 텍스트 필드 글자 내용이 ( 한글자 한글자 ) 입력되거나 지워질 때 호출이 되고 (허락)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let maxLength = 10
let currentString: NSString = (textField.text ?? "") as NSString
let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
return newString.length <= maxLength
}
이러한 방식으로 구현할 수 있다.
디테일한 코드는 사실 스텍오버 플로우에서 긁어온 것이다.
구현방식자체가 중요하다기 보다는, 어떤 시점에서 구현해야하는지 아는 것이 첫번 째다.
'iOS' 카테고리의 다른 글
[iOS][fastlane] 자동배포, testFilght 올리기 (0) | 2023.09.03 |
---|---|
[iOS] FlexLayout, PinLayout 이용해서 뷰 그리기 (0) | 2023.06.17 |
[iOS]This method should not be called on the main thread as it may lead to UI unresponsiveness. Thread 관련 문제? (2) | 2023.03.21 |
[iOS] Swift 의 lazy Variables의 특징과 사용시 고려사항 (0) | 2023.01.14 |
iOS에서 navigationController, segue를 이용한 화면전환 종류와 방법 (0) | 2022.12.29 |