IOS-UITExtField 암호가 비밀문일 경우 삭제 버튼을 누르면 비밀문이 하나씩 삭제됩니다

5326 단어
개발 언어:swift4.2 쓸데없는 말 하지 말고 코드에 올라가서 첫걸음으로 밀문을 마지막에서 앞으로 하나씩 삭제한다.
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
  }

됐어, 이제 천하가 태평해졌어.

좋은 웹페이지 즐겨찾기