IOS-UITExtField 암호가 비밀문일 경우 삭제 버튼을 누르면 비밀문이 하나씩 삭제됩니다
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
return false
}
return true
}
이 단계에서 커서가 밀문 중간에서 앞으로 삭제되면 밀문 커서를 삭제하면 도망가는 밀문의 마지막 위치를 발견할 수 있습니다. 두 번째 단계에서 이 문제를 해결합니다.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
let start = textField.position(from:textField.beginningOfDocument, offset: range.location)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
return false;
}
return true
}
코드를 수정하면 커서가 정상인 것을 발견할 수 있지만 암호 중간에서 끝까지 삭제한 후에 커서 뒤의 암호가 한꺼번에 삭제되는 것을 발견할 수 있다. 이때 세 번째 단계는 UItextField의 deleteBackward()를 다시 쓰는 방법이다.
class BaseTextField: UITextField {
weak var baseTextFieldDelegate: BaseTextFieldDeleteDelegate?
override func deleteBackward() {
super.deleteBackward()
guard let baseTextFieldDelegate = baseTextFieldDelegate else {
print("baseTextFieldDelegate is nil.")
return
}
baseTextFieldDelegate.baseTextFieldDeleteBackward(baseTextField: self)
}
}
다음 변수 var secretString을 정의합니다.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
let start = textField.position(from:textField.beginningOfDocument, offset: range.location)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
secretString = secretInputField.text!
return false;
}
return true
}
BaseTextField를 실현하는 프록시 방법
func baseTextFieldDeleteBackward(baseTextField: BaseTextField) {
if baseTextField == secretInputField {
secretInputField.text = secretString
}
}
여기까지 하면 끝날 줄 알았어?조금만 더 소년을 누르면 내 하늘을 발견할 수 있다. 중간에서 밀문을 삭제할 때 삭제한 후에 커서가 맨 뒤로 달려간다. 다섯 번째 걸음에 이어.
func baseTextFieldDeleteBackward(baseTextField: BaseTextField) {
if baseTextField == secretInputField {
secretInputField.text = secretString
if secretInputField.text != "" && secretInputField.isSecureTextEntry {
///
let start = baseTextField.position(from:baseTextField.beginningOfDocument, offset: 0)
let end = baseTextField.position(from: start!, offset: 0)
baseTextField.selectedTextRange = baseTextField.textRange(from: start!, to: end!)
return
}
}
}
여기까지 와서 점을 찍고 또 점을 찍고 드디어 밀문에 문제가 없다는 것을 발견했으니 너는 먼저 웃어도 된다. 명문에 또 문제가 생겼기 때문에 명문을 지울 수 없다는 것을 발견했으니 마지막 걸음으로 가자.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
let start = textField.position(from:textField.beginningOfDocument, offset: range.location)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
secretString = secretInputField.text!
return false;
}
if textField == secretInputField && string != "" {
textField.text = textfieldContent2;
let start = textField.position(from:textField.beginningOfDocument, offset: range.location+1)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
secretString = secretInputField.text!
return false;
}
return true
}
됐어, 이제 천하가 태평해졌어.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.