적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift iOS] detect backspace in empty UITextField

hongssup_ 2022. 7. 28. 17:26
반응형

UITextField에서 backspace를 감지하는 법은 두가지로 나뉜다. 

1. 존재하는 텍스트를 지울 때

2. 빈 field에서 감지할 때 

흔히 사용하게 되는 방법이 1번인데, 빈 textField에서 사용할 경우 백스페이스 감지가 되지 않아 2번의 방법을 알아보았다. 

 

1. Detect Backspace Event

: 존재하는 텍스트를 지울 때는 크게 어렵지 않다. 

textField shouldChangeCharactersIn 함수 내에서 바로 체크를 해줘도 되지만, 

다음과 같이 String에 extension으로 Bool 변수를 만들어 놓으면 어디서든 쉽게 확인할 수 있다. 

extension String {
    var isBackspace: Bool {
        if let char = self.cString(using: String.Encoding.utf8) {
            return strcmp(char, "\\b") == -92
        } else {
            return false
        }
    }
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if string.isBackspace {
        debugPrint("backspace pressed")
    }
    return true
}

 

2. Detect Backspace Event in Empty TextField

: 빈 field에서 backspace event를 감지하는 것은 좀 더 까다롭다.

1. Delegate 프로토콜을 만들어 새로운 textField 클래스에서 해당 delegate를 위임받아 함수를 실행할 수 있도록 해준다. 

protocol MyTextFieldDelegate: AnyObject {
    func textFieldDidDelete(_ textField: MyTextField)
}

class MyTextField: UITextField {
    weak var myDelegate: MyTextFieldDelegate?
    
    override func deleteBackward() {
        super.deleteBackward()
        myDelegate?.textFieldDidDelete(self)
    }
}

2. 해당 뷰컨트롤러에 MyTextFieldDelegate 프로토콜을 추가해준 후

3. 다음과 같이 UITextField를 생성해 주고

lazy var textField: MyTextField = {
    let field = MyTextField()
    field.myDelegate =. self
    return field
}

4. 원하는 곳에서 다음과 같이 설정해두면, textField가 비어있는 상태에서도 backspace 감지를 할 수 있다. 

func textFieldDidDelete(_ textField: MyTextField) {
    debugPrint("textFieldDidDelete")
}

 

참고 : https://w3toppers.com/detect-backspace-in-empty-uitextfield/

728x90
반응형