본문 바로가기
2023년 부터/iOS&Swift

[iOS] UITextField 글자수 제한, 백스페이스 처리

by JeongUPark 2023. 11. 21.
반응형

iOS Swift를 사용하여 개발할 때 이름을 입력하거나 비밀번호를 입력하는 등 1줄로 입력을 받을 때 UITextField라는 개체를 사용합니다.

이때 비밀번호를 20자 이하로 작성해 주세요 등 입력 글자수를 제한해야 할 때가 있는데 그 방식에 대하여 정리해 보려 합니다.

Delegate 설정

우선 TextField의 글자 제한을 위하여 델리게이트를 위임해주어야 합니다.

class ViewController : UIViewController {

    @IBOutlet private weak var textField : UITextField!
    
    //MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        self.textField.delegate = self
    }
    
 	....   
}

extension ViewController : UITextFieldDelegate {
	func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        return true
    }
}

textField에 델리게이트를 적용하기 위해서 Storyboard를 사용하거나 Code를 사용하여 ViewController에 추가해 줄 수 있습니다. 그렇게 추가한 textField에 UITextFieldDelegate를 적용해 줍니다. 그리고 그 delegate에서 위의 코드와 같은 메서드를 추가해 줍니다. 추가된 메서드는 지정된 텍스트를 변경할지 여부를 묻는 메서드입니다. false면 변경하지 않고 true면 변경합니다. 더 자세한 사항은 설명은 여기서 확인 가능합니다.

글자수 제한 하기

이제 TextField에 글자가 입력 또는 변경되면 위에서 추가한 delegate의 메서드에 요청이 됩니다. 그럼 글자 변경을 감지하여 이를 적용할지 말지를 결정하게 됩니다. 그러므로 만약 4글자까지만 입력가능하도록 글자수를 제한하려면 아래와 같이 code를 작성해 주면 됩니다.

....
extension ViewController : UITextFieldDelegate {
	func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard textField.text!.count < 4 else { return false } // 4 글자로 제한
        return true
    }
}

백스페이스 제한

위의 코드만 작성해서 동작을 하게 되면 입력 글자가 4글자가 된 이후로는 입력도 삭제도 아무런 변경도 일어나지 안헥 됩니다. 그러므로 백스페이스를 입력할 경우에는 글자 삭제가 가능하도록 로직을 추가해 주어야 합니다. 

로직의 경우 백스페이스(삭제)를 누를 경우 "\b"의 String 입력이 되고 이를 UInt32로 변경하면 -92의 값을 가지게 됩니다. 그래서 백스페이스 입력 시 들어온 String 값을 이용하여 동작하도록 Code를 작성하면 안래와 같습니다.

// MARK: - TextField delegate
extension ViewController: UITextFieldDelegate {
// 글자수 확인
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // 입력이 백스페이스인지 구분한다.
        if let char = string.cString(using: String.Encoding.utf8) {
            let isBackSpace = strcmp(char, "\\b")
            // 백스페이스면 변경 가능
            if isBackSpace == -92 {
                return true
            }
        }
        guard textField.text!.count < 4 else { return false } // 4 글자로 제한
        return true
    }
}

 

최종 Code

class ViewController : UIViewController {

    @IBOutlet private weak var textField : UITextField!
    
    //MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        self.textField.delegate = self
    }
    
 	....   
}

extension ViewController: UITextFieldDelegate {
    // 글자수 확인
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // 백스페이스 처리, 이 코드가 없으면 4글자 입력 후 수정이 안된다.31
        if let char = string.cString(using: String.Encoding.utf8) {
            let isBackSpace = strcmp(char, "\\b")
            if isBackSpace == -92 {
                return true
            }
        }
        guard textField.text!.count < 4 else { return false } // 4 글자로 제한
        return true
    }
}

 

반응형