ViewController내부에서 UITextField타입의 속성을 생성하면 UITextField의 다양한 속성기능을 사용할 수 있습니다.
해당 작업은 델리게이트 패턴(Delegate Pattern)방식 없이 사용 가능합니다.
// UITextField타입의 속성 생성 @IBOutlet weak var textField: UITextField! // 모바일 키보드를 Email전용 키보드로 변환 textField.keyboardType = .emailAddress // textField에 힌트값 설정 textField.placeholder = "이메일" // textField의 테두리를 둥근 사각형으로 설정 textField.borderStyle = .roundedRect // textField에 값 입력 시 오른쪽에 전체 삭제 버튼 생성 textField.clearButtonMode = .always // 모바일 키보드의 return 버튼을 search로 변경 (기능은 동일) textField.returnKeyType = .search // 별다른 이벤트없이 앱을 실행하자마자 모바일 키보드를 나타나게 설정 (속성이아닌 메서드) textField.becomeFirstResponder()
ViewController에서 UITextField의 작업이 필요한 경우가 종종 있지만, 각각의 객체는 서로 하는 작업이 다르기 때문에 일반적인 방법으로는 UITextField의 작업을 수행할 수 없습니다.
이러한 문제점을 해결하기 위해 만들어진 방법이 델리게이트 패턴(Delegate Pattern)입니다.
ViewController에서 UITextField타입의 작업(메서드)을 위임받아 사용하기 위해서는
UITextFieldDelegate
프로토콜을 채택해야 합니다.위임 프로토콜을 채택해야지만 해당 프로토콜에 정의된 다양한 작업을 위임받아 사용할 수 있습니다.
class ViewController: UIViewController, UITextFieldDelegate { ... }
.delegate
속성을 사용하여 textField의 대리자를 ViewController로 설정해야합니다.textField.delegate = self //textField.delegate = ViewController
UITextFieldDelegate 프로토콜 내부에 정의되어있는 다양한 작업(메서드 등)을 위임받아서 사용하는 방식입니다.
✅ 텍스트필드의 입력을 시작할 때 호출 (시작의 여부를 물어보는 작업)
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { print(#function) return true }
✅ 텍스트필드의 입력이 시작되면 해당 시점을 호출
func textFieldDidBeginEditing(_ textField: UITextField) { print(#function) print("유저가 텍스트필드에 입력을 시작했습니다.") }
✅ 텍스트필드의 입력값을 한 번에 없에는 버튼을 누를 때 호출
입력값을 한 번에 없에는 버튼은
textField.clearButtonMode = .always
코드에 의해 만들어집니다.func textFieldShouldClear(_ textField: UITextField) -> Bool { print(#function) return true }
✅ ⭐️텍스트필드에 글자 내용(한 글자 한 글자)이 입력되거나 지워질 때 호출 (입력 허용 여부까지 선택 가능)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { print(#function) print(string) // 출력 창에 문자(String type) 하나하나 출력되는걸 확인할 수 있음, 문자열만 출력 return true }
텍스트필드의 입력값을 문자로만 한정하는 코드(숫자 입력을 허용하지 않는 논리식)
if Int(string) != nil { // (숫자로 변환이 된다면 nil이 아닐테니) return false } else{ // 10글자이상 입력되는 것을 막는 코드 + 10글자 이하만 받기 guard let text = textField.text else { return true } let newLength = text.count + string.count - range.length return newLength <= 10 }
텍스트필드의 입력값을 10자리로 한정하는 코드
if (textField.text?.count)! + string.count > 10 { return false } else { return true }
✅ 텍스트필드의 엔터(return)키가 눌려질 때 호출(엔터키를 누른 다음 동작의 허용 여부까지 선택 가능)
func textFieldShouldReturn(_ textField: UITextField) -> Bool { print(#function) if textField.text?.isEmpty == true{ textField.placeholder = "이메일을 입력하세요" return false // 다음동작 허용X } else{ return true // 다음동작 허용O } }
✅ 텍스트필드의 입력이 끝날 때 호출 (텍스트 필드의 종료 여부를 허락)
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { print(#function) return true }
✅ 텍스트필드의 입력이 실제로 종료되었을 때 종료 시점을 기준으로 호출
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) { print(#function) print("텍스트 필드 입력 종료") }
import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.gray textField.placeholder = "email" textField.borderStyle = UITextField.BorderStyle.roundedRect textField.clearButtonMode = UITextField.ViewMode.always textField.keyboardType = .emailAddress textField.returnKeyType = .next textField.becomeFirstResponder() textField.delegate = self } // 텍스트필드의 입력을 시작할때 호출 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { print(#function) return true } // 텍스트필드의 입력이 시작되면 호출 func textFieldDidBeginEditing(_ textField: UITextField) { print(#function) } // 텍스트필드 내용을 삭제할 때 호출 func textFieldShouldClear(_ textField: UITextField) -> Bool { print(#function) return true } // 텍스트필드에 글자내용이 (한글자 한글자) 입력되거나 지워질때 호출 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { print(#function) print(string) return true } // 텍스트필드의 엔터키가 눌러졌을때 호출 func textFieldShouldReturn(_ textField: UITextField) -> Bool { print(#function) return true } // 텍스트필드의 입력이 끝날때 호출 func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { print(#function) return true } // 텍스트필드의 입력이 실제로 끝났을때 해당 시점에서 호출 func textFieldDidEndEditing(_ textField: UITextField) { print(#function) } }