ViewController에서 UITextField작업 수행하기

썹스·2023년 1월 4일
0

UITextField 타입의 간단한 속성 및 기능

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()

UITextField의 작업을 위임받아 사용

ViewController에서 UITextField의 작업이 필요한 경우가 종종 있지만, 각각의 객체는 서로 하는 작업이 다르기 때문에 일반적인 방법으로는 UITextField의 작업을 수행할 수 없습니다.

이러한 문제점을 해결하기 위해 만들어진 방법이 델리게이트 패턴(Delegate Pattern)입니다.

📌 UITextFieldDelegate 프로토콜 채택하기

ViewController에서 UITextField타입의 작업(메서드)을 위임받아 사용하기 위해서는 UITextFieldDelegate 프로토콜을 채택해야 합니다.

위임 프로토콜을 채택해야지만 해당 프로토콜에 정의된 다양한 작업을 위임받아 사용할 수 있습니다.

class ViewController: UIViewController, UITextFieldDelegate {
...
}

📌 UITextField의 작업 대리자 설정하기

.delegate속성을 사용하여 textField의 대리자를 ViewController로 설정해야합니다.

textField.delegate = self  //textField.delegate = ViewController

📌 UITextField로부터 위임받은 작업 수행

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)
    }
}
profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글