반응형
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
반응형
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Swift] GCD - DispatchSemaphore (0) | 2022.09.06 |
---|---|
notification / callback / delegate 사용법 (0) | 2022.08.17 |
[Swift Layout] SnapKit 사용해보기 (0) | 2022.07.07 |
[Swift iOS] NSMutableAttributedString 문자열 부분 설정 (0) | 2022.07.04 |
[Swift] inout parameter (0) | 2022.05.22 |