์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

UITextField์™€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด

๐ŸŽ iOS/Swift

by AHN.Jihyeon 2024. 8. 28. 23:36

๋ณธ๋ฌธ

UITextField

UITextField๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ์ด๊ณ , 

๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์€ UITextField์˜ ๋™์ž‘์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

 

textField.delegate = self  -> ํ…์ŠคํŠธํ•„๋“œ์˜ ๋Œ€๋ฆฌ์ž๊ฐ€ ๋ทฐ์ปจ์ด ๋จ. ํ…์ŠคํŠธํ•„๋“œ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ ์ „๋‹ฌ ๋ฐ›์Œ

ํ…์ŠคํŠธํ•„๋“œ์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ์‹œ์ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ํ…Œ๋‹ˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ผ. 

 

textField.becomeFirstResponder()  //ํ‚ค๋ณด๋“œ ์˜ฌ๋ผ์˜ด
textField.resignFirstResponder()  //ํ‚ค๋ณด๋“œ ๋‚ด๋ ค๊ฐ

 

 

์ฃผ์š” UITextField Delegate ๋ฉ”์„œ๋“œ์™€ ์‚ฌ์šฉ ์˜ˆ์ œ

textFieldShouldBeginEditing(_:)
ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ํŽธ์ง‘์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ ํ•„๋“œ๋ฅผ ์„ ํƒํ•  ๋•Œ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฑด์— ๋”ฐ๋ผ ํŽธ์ง‘์„ ๋ง‰๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    // ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ํŽธ์ง‘ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
    return true // true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํŽธ์ง‘์ด ์‹œ์ž‘๋จ
}

 

 

textFieldDidBeginEditing(_:)

ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ํŽธ์ง‘์„ ์‹œ์ž‘ํ•œ ์งํ›„์— ํ˜ธ์ถœ๋œ๋‹ค. ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์„ ๋•Œ ํŠน์ • ์ž‘์—…์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

func textFieldDidBeginEditing(_ textField: UITextField) {
    print("Editing started")
}

 

 

textFieldShouldEndEditing(_:)

ํ…์ŠคํŠธ ํ•„๋“œ์˜ ํŽธ์ง‘์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ํŽธ์ง‘ ์ข…๋ฃŒ๋ฅผ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    // ์กฐ๊ฑด์— ๋”ฐ๋ผ ํŽธ์ง‘ ์ข…๋ฃŒ๋ฅผ ํ—ˆ์šฉํ• ์ง€ ๊ฒฐ์ •
    return true
}

 

 

textFieldDidEndEditing(_:)

ํ…์ŠคํŠธ ํ•„๋“œ์˜ ํŽธ์ง‘์ด ์ข…๋ฃŒ๋œ ํ›„ ํ˜ธ์ถœ๋œ๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ์™„๋ฃŒ๋œ ํ›„ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

func textFieldDidEndEditing(_ textField: UITextField) {
    print("Editing ended")
}

 

 

textField(_:shouldChangeCharactersIn:replacementString:)

ํ…์ŠคํŠธ ํ•„๋“œ์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ์ œํ•œํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

ํ…์ŠคํŠธํ•„๋“œ์˜ ๊ธ€์ž ๋‚ด์šฉ์ด ํ•œ๊ธ€์žํ•œ๊ธ€์ž ์ž…๋ ฅ๋˜๊ฑฐ๋‚˜ ์ง€์›Œ์งˆ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ๋ฅผ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Œ
    let currentText = textField.text ?? ""
    let updatedText = (currentText as NSString).replacingCharacters(in: range, with: string)
    
    // ์˜ˆ: ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ๊ฐ€ 10์ž๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ์ œํ•œ
    return updatedText.count <= 10
    
    // ์ด๋ฉ”์ผ ์ฃผ์†Œ ํŒจํ„ด ํ™•์ธ - ์ •๊ทœ์‹
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegex)
    
    return emailTest.evaluate(with: updatedText)
}

}


//์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต - ์ž…๋ ฅ์ด ์œ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํ…์ŠคํŠธํ•„๋“œ ํ…Œ๋‘๋ฆฌ ์ƒ‰ ๋ณ€๊ฒฝ ๋˜๋Š” ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ ๋“ฑ
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let currentText = textField.text ?? ""
    let updatedText = (currentText as NSString).replacingCharacters(in: range, with: string)
    
    if !validateInput(text: updatedText) {
        textField.layer.borderColor = UIColor.red.cgColor
        textField.layer.borderWidth = 1.0
    } else {
        textField.layer.borderColor = UIColor.green.cgColor
        textField.layer.borderWidth = 1.0
    }
    return true
}

 

 

textFieldShouldReturn(_:)

์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌํ„ด(Return) ํ‚ค๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. ์ฃผ๋กœ ํ‚ค๋ณด๋“œ๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๋‹ค์Œ ์ž…๋ ฅ ํ•„๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder() // ํ‚ค๋ณด๋“œ ์ˆจ๊ธฐ๊ธฐ
    return true
}

 

 

 


์—ฌ๋Ÿฌ๊ฐœ์˜ UITextField๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ํŠน์ • ํ…์ŠคํŠธ ํ•„๋“œ์—๋งŒ ์ ์šฉํ•˜๋ ค๋ฉด?

// Tag๋ฅผ ์‚ฌ์šฉํ•œ ์‹๋ณ„
override func viewDidLoad() {
    super.viewDidLoad()
    textField1.tag = 1
    textField2.tag = 2
}

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField.tag == 1 {
        // textField1์—๋งŒ ์ ์šฉ๋  ์ œํ•œ
        return string.allSatisfy { $0.isNumber } // ์ˆซ์ž๋งŒ ์ž…๋ ฅ ๊ฐ€๋Šฅ
    } else if textField.tag == 2 {
        // textField2์—๋งŒ ์ ์šฉ๋  ์ œํ•œ
        return string.count <= 1 // ํ•œ ๋ฒˆ์— ํ•œ ๊ธ€์ž๋งŒ ์ž…๋ ฅ ๊ฐ€๋Šฅ
    }
    return true
}



// ํ…์ŠคํŠธํ•„๋“œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋น„๊ต 
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField === textField1 {
        // textField1์— ์ ์šฉ๋  ์ œํ•œ
        return string.count <= 5 // ์ตœ๋Œ€ 5๊ธ€์ž ์ œํ•œ
    } else if textField === textField2 {
        // textField2์— ์ ์šฉ๋  ์ œํ•œ
        return string.allSatisfy { $0.isUppercase } // ๋Œ€๋ฌธ์ž๋งŒ ํ—ˆ์šฉ
    }
    return true
}

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ