Focus On Develop ๐ŸคŸ๐ŸคŸ

[Swift] UITextField ํ•œ๊ธ€ ๊ธ€์ž์ˆ˜ ์ œํ•œ ๋ณธ๋ฌธ

iOS [Swift]/๊ธฐ์ดˆ๋ฅผ ํƒ„ํƒ„ํžˆ!

[Swift] UITextField ํ•œ๊ธ€ ๊ธ€์ž์ˆ˜ ์ œํ•œ

๋ˆ„๋ฆฌ๋‹ฌ์ดํ‹€ 2021. 10. 26. 14:31

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์€ UITextField์— ํ•œ๊ธ€์ž…๋ ฅ์‹œ ๊ธ€์ž์ˆ˜ ์ œํ•œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค!

์ด๋ฒˆ์— ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๊ธ€์ž์ˆ˜ ์ œํ•œ์ด ์žˆ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ๋„ฃ๊ฒŒ ๋๋Š”๋ฐ, ์˜์–ด๋‚˜ ์ด๋ชจ์ง€๋กœ๋Š” ๊ธ€์ž์ˆ˜ ์ œํ•œ์ด ์ž˜ ๋™์ž‘ํ–ˆ๋Š”๋ฐ, ํ•œ๊ธ€ ์ž…๋ ฅ์‹œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋”๋ผ๊ตฌ์š” ๐Ÿ˜ญ

 

์˜ˆ๋ฅผ๋“ค๋ฉด 5์ž ์ œํ•œ์ด๋ผ๊ณ  ํ• ๋•Œ "๊ฐ€๋‚˜๋‹ค๋ผใ…" ์ด๋ ‡๊ฒŒ "ใ…"๋ฅผ ์น˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๊ฑฐ๋‚˜, "๊ฐ€๋‚˜๋‹ค๋ผ๋ง˜"์„ ์น˜๊ณ  ์‹ถ์€๋ฐ "๊ฐ€๋‚˜๋‹ค๋ผ๋งˆ"+"ใ…"์ด ์ž…๋ ฅ์ด ์•ˆ๋˜๊ฑฐ๋‚˜, "๊ฐ€๋‚˜๋‹ค๋ผ๋งˆ"์—์„œ ๊ณ„์† ํƒ€์ดํ•‘์‹œ "๋งˆ" ๋ถ€๋ถ„์— ํƒ€์ดํ•‘ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๊ณ„์† ์ž…๋ ฅ๋˜๊ฑฐ๋‚˜ ใ… ใ…  ๊ทธ๋ž˜์„œ ๊ฒช์—ˆ๋˜ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ์ •๋ฆฌํ•˜๋ฉด์„œ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•ด๋‘๋ ค๊ณ  ํ•ด์š”!!

 


 

์•„๋งˆ ์ด ๊ธ€์€ ๋น„์ธ๊ธฐ ๊ธ€์ด๋ผ์„œ ใ…Žใ…Ž ๋ˆ„๊ตฌ์—๊ฒŒ ๋…ธ์ถœ์ด ๋ ์ง€ ์‚ฌ์‹ค ์ž˜๋ชจ๋ฅด๊ฒ ์ง€๋งŒ.. ์ด๊นŒ์ง€ ์˜ค์…จ๋‹ค๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋ณธ์  ๋งŽ์œผ์‹ค๊ฑฐ์—์š”! 

๊ตฌ๊ธ€๋งํ•ด๋ณด๋ฉด TextFieldDelegate์—์„œ ์ œ๊ณตํ•˜๋Š” shouldChangeCharactersIn ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ๋ณดํŽธ์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด๋”๋ผ๊ตฌ์š”~~ shouldChangeCharactersIn ๋ฉ”์†Œ๋“œ๋Š” delegate๋กœ ์ง€์ •๋œ textField์— ๋ญ”๊ฐ€ ํƒ€์ดํ•‘์ด ๋˜๋ฉด ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋Š” ๋ฉ”์†Œ๋“œ์—์š”~~

์•„!! ํ˜น์‹œ ์•„๋ž˜์˜ ์ฝ”๋“œ๊นŒ์ง€ ์‹œ๋„ํ•ด๋ณด์‹  ๋ถ„์ด๋ฉด ์ €~~๊ธฐ์•„๋ž˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ”๋กœ skipํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค ๐Ÿ‘‰

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // backspace ํ—ˆ์šฉ
        if let char = string.cString(using: String.Encoding.utf8) {
            let isBackSpace = strcmp(char, "\\b")
            if isBackSpace == -92 {
                return true
            }
        }

        guard let text = textField.text else { return false }
        if text.count >= MAX_LENGTH {
            return false
        }

        return true
    }

์ด๋ ‡๊ฒŒ ใ…Žใ…Žใ…Ž 5์ž์ž…๋ ฅ์„ ํ–ˆ์„๋•Œ backspace๋„ ๋จนํ†ต์ด ๋˜๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ, backspace๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์™”์„๋•Œ๋Š” ํ˜„์žฌ ๊ธ€์ž์ˆ˜์™€ ์ƒ๊ด€์—†์ด ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ธ์ฝ”๋”ฉํ•ด์„œ ์ฐพ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•ด์คฌ์–ด์š”!

 


 

์–ผํ• ๋ณด๋ฉด ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ฃ ~~? ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ "๊ฐ€๋‚˜๋‹ค๋ผ๋งˆ" + ์ž์Œ์„ ํ–ˆ์„๋•Œ, ๋ฐ›์นจ์ด ์ž…๋ ฅ๋˜์ง€ ์•Š์•„์š”. ์ด๋ฏธ MAX_LENGTH๋กœ ์ง€์ •ํ•œ 5์ž๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ ~ ๊ทธ๋ž˜์„œ ใ… ใ…  shouldChangeCharactersIn ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋Š” ์•ˆ๋˜๊ฒ ๊ตฌ๋‚˜ ์‹ถ์—ˆ์–ด์š”.

PS. ์ด๋ ‡๊ฒŒ ํ•œ๊ธ€์ž…๋ ฅ์‹œ ๋ฐ›์นจ์ด ์ž…๋ ฅ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ๊ฐ€ textField ๋Œ€์‹  textView๋กœ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค๋Š” ํฌ์ŠคํŒ…์„ ๋ดค๋Š”๋ฐ, ์ œ๊ฐ€ ์ง์ ‘ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋˜‘๊ฐ™์ด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋‚ญ๋น„ ํ•˜์ง€๋งˆ์„ธ์š”~~

 

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๋‹ค๊ฐ€.. ๋งŒ์•ฝ์— textField์˜ ๊ธ€์ž์ˆ˜๋ฅผ ํ™•์ธํ•ด์„œ ์›ํ•˜๋Š” ๊ธธ์ด๋ณด๋‹ค ๊ธธ๋ฉด ๊ทธ๋ƒฅ ์ž˜๋ผ์„œ ๋ณด์—ฌ์ฃผ๋ฉด ๋งˆ์น˜ ๋”ฑ ๊ทธ ๊ธธ์ด๊นŒ์ง€๋งŒ ๋ณด์—ฌ์ง€์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ์ž‘์ „์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ดค์–ด์š”. shouldChangeCharactersIn ์ด ๋ฉ”์†Œ๋“œ๋Š” ๊ณผ๊ฐํžˆ ๋ฒ„๋ฆฌ๊ณ .. ์˜ต์ €๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์–ด์š”.

NotificationCenter.default.addObserver(self, selector: #selector(textDidChange), name: UITextField.textDidChangeNotification, object: nil)

UITextField์— ๋ญ”๊ฐ€ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด textDidChange๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ• ๊ฑฐ๊ณ , ์ด ๋ฉ”์†Œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•„์š”.

@objc func textDidChange(noti: NSNotification) {
        if let text = messageTextField.text {
            if text.count >= MAX_LENGTH {
                let fixedText = text.subString(startIndex: 0, endIndex: MAX_LENGTH - 1)
                messageTextField.text = fixedText
            }
        }
    }

๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ๊ธธ์ด๋ณด๋‹ค ๊ธธ๋ฉด ์ง€์ •ํ•œ ๊ธธ์ด๊นŒ์ง€๋งŒ ์งค๋ผ์ค˜~ ํ•˜๊ณ  ๋ง์ด์ฃ . ๊ทธ๋Ÿฐ๋ฐ...

์ด๋ ‡๊ฒŒ ใ… ใ…  5์ž๋ผ๊ณ  ํ–ˆ์„๋•Œ 5์ž๊นŒ์ง€๋งŒ ๋ณด์—ฌ์ง€๋Š”๊ฑด ๋งž์•„์š”..๊ทธ๋Ÿฐ๋ฐ ๋ญ ์น ๋•Œ๋งˆ๋‹ค 5๋ฒˆ์งธ ๊ธ€์ž๊ฐ€ ๋ฐ”๋€Œ์–ด๋ฒ„๋ฆฌ๋Š” ํ˜„์ƒ์ด.. ๊ทธ๋ฆฌ๊ณ  ์ง€์šฐ๋Š” ๊ณผ์ •์—์„œ๋„ ํƒ€์ดํ•‘ํ–ˆ๋˜ ๋ฌธ์ž๋“ค์ด ๊ฐ‘์ž๊ธฐ ๋ง‰ ๋“ฑ์žฅํ•˜๋Š” ๊ทธ๋Ÿฐ ๊ธฐ๊ดดํ•œ ํ˜„์ƒ์ด..๋˜๋ฅด๋ฅด...ใ…‹ใ…‹ใ…‹

์ €๋Š” ์ฒ˜์Œ์—๋Š” ๋ญ”๊ฐ€ buffer๊ฐ™์€๊ฒŒ ์žˆ์–ด์„œ, ๊ฑฐ๊ธฐ์— ๊ธฐ๋ก๋œ ๋ฌธ์ž๋“ค์ด ๋‚˜์˜ค๋Š” ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ์š”~ ๊ทธ๊ฒŒ ์•„๋‹ˆ๋”๋ผ๊ตฌ์š”.

 

์›์ธ์€ textField์˜ ์ž…๋ ฅ ํฌ์ง€์…˜(์ง€๊ธˆ ์ž…๋ ฅ๋˜์–ด์•ผ ํ•  ์ž๋ฆฌ)๊ฐ€ 6๋ฒˆ์งธ ๊ธ€์ž๊ฐ€ ์•„๋‹ˆ๋ผ, 5๋ฒˆ์งธ์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์˜€์–ด์š”.

์ฆ‰, "์ผ์ด์‚ผ์‚ฌ์˜ค" ๋ผ๊ณ  ํƒ€์ดํ•‘์„ ํ•˜๋ฉด ์ œ๊ฐ€ ์›ํ–ˆ๋˜ ์ž…๋ ฅ ํฌ์ง€์…˜์€ "์˜ค" ๋‹ค์Œ์— ์œ„์น˜ํ•ด์„œ ํƒ€์ดํ•‘์„ ํ•ด๋„ "์˜ค" ์ดํ›„๋กœ๋Š” ๊ทธ๋ƒฅ ์งค๋ฆฌ๊ธฐ๋ฅผ ๋ฐ”๋žฌ์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š”.. "์˜ค" ์œ„์น˜์— ์ž…๋ ฅํฌ์ง€์…˜์ด ์„ค์ •๋˜๋Š” ๊ฑฐ์ฃ . ๊ทธ๋ž˜์„œ "์˜ค"๋ผ๋Š” ํฌ์ง€์…˜์˜ ๊ธ€์ž๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๋Š” ํ˜„์ƒ์ด.. ๐Ÿ˜ญ

 

๊ทธ๋Ÿผ ์ž…๋ ฅ ํฌ์ง€์…˜๋งŒ "์˜ค" ๋’ค๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ผผ์ˆ˜(?)๋งŒ ์žˆ์œผ๋ฉด ์–ด๋–จ๊นŒ, ์‹ถ์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์–ด์š”!

 

 

 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

@objc func textDidChange(noti: NSNotification) {
        if let text = messageTextField.text {
            if text.count >= MAX_LENGTH {
                let fixedText = text.subString(startIndex: 0, endIndex: MAX_LENGTH - 1)
                messageTextField.text = fixedText + " "
                
                let when = DispatchTime.now() + 0.01
                DispatchQueue.main.asyncAfter(deadline: when) {
                    self.messageTextField.text = fixedText
                }
            }
        }
    }

์ด๋ ‡๊ฒŒ ์ž…๋ ฅํ•œ ๋ฌธ์ž ๋’ค์— " " ๊ณต๋ฐฑ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด์„œ ์ž…๋ ฅํฌ์ง€์…˜์„ ๋งˆ์น˜ "์˜ค"๋‹ค์Œ์œผ๋กœ ์ž„์˜๋กœ ๋งŒ๋“ค์–ด ๋ฒ„๋ฆฌ๋Š”๊ฑฐ์ฃ .

์˜๋ฌธ์ด๋‚˜ ์ด๋ชจ์ง€ ๋“ฑ์€ ์˜ํ–ฅ์ด ์—†์ง€๋งŒ.. ์ด๊ฒŒ ํ•œ๊ธ€์ด ์ดˆ์„ฑ, ์ค‘์„ฑ, ์ข…์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋”๋ผ๊ตฌ์š”.

ํ™”๋ฉด์ƒ์— ๋™์ž‘์€ ์ž˜ ํ•ด๊ฒฐํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ.. ๊ทธ๋ž˜๋„ ์–ธ์ œ๊นŒ์ง€๋‚˜ ๊ผผ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๐Ÿ˜‚

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•œ๊ธ€์ž…๋ ฅ์‹œ ๊ธ€์ž์ˆ˜ ์ œํ•œํ•˜๋Š” ๊ฒƒ ๊ด€๋ จํ•ด์„œ ํ•ด๊ฒฐํ•˜์‹  ๋ถ„ ์žˆ์œผ๋ฉด ๊ณต์œ ํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~~

 

๊ทธ๋Ÿผ ์˜ค๋Š˜๋„ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ๊ธธ ๋ฐ”๋ž˜์š” ๐Ÿ™

 

 

 

Comments