How shouldChangeCharactersInRange works in Swift?

前端 未结 7 682
不思量自难忘°
不思量自难忘° 2020-12-07 17:38

I\'m using shouldChangeCharactersInRange as a way of using on-the-fly type search.

However I\'m having a problem, shouldChangeCharactersInRange get

相关标签:
7条回答
  • 2020-12-07 17:47

    To get the exact text in the my UITextField component in Swift 3.0 I used:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
       let enteredTxt = textField.text! + string
       doSomethingWithTxt(enteredTxt) //some custom method
    }
    
    0 讨论(0)
  • 2020-12-07 17:48

    This function is called when changes are made but UI is not updated and waiting for your choice

    Take a look at returned bool value

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
    
    • If you return true - it means that iOS accept changes(text, caret...)
    • If you return false - it means that you are responsible for all this stuff
    0 讨论(0)
  • 2020-12-07 17:54

    Swift 3


    If you want to pre-process the characters the user typed or pasted, the following solution workes like a charm

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        let strippedString = <change replacements string so it fits your requirement - strip, trim, etc>
    
        // replace current content with stripped content
        if let replaceStart = textField.position(from: textField.beginningOfDocument, offset: range.location),
            let replaceEnd = textField.position(from: replaceStart, offset: range.length),
            let textRange = textField.textRange(from: replaceStart, to: replaceEnd) {
    
            textField.replace(textRange, withText: strippedString)
        }
        return false
    }
    

    Find it here: https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047

    0 讨论(0)
  • 2020-12-07 17:58

    stringByReplacingCharactersInRange return a new string, so how about:

    func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
        if let text = textField.text as NSString? {
            let txtAfterUpdate = text.replacingCharacters(in: range, with: string)
            self.callMyMethod(txtAfterUpdate)
        }
        return true
    }
    
    0 讨论(0)
  • 2020-12-07 17:58

    Swift 3 & 4

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let textFieldText: NSString = (textField.text ?? "") as NSString
        let txtAfterUpdate = textFieldText.replacingCharacters(in: range, with: string)
        callMyMethod(txtAfterUpdate)
    
        return true
    }
    
    func textFieldShouldClear(_ textField: UITextField) -> Bool {
        callMyMethod("")
        return true
    }
    

    Swift 2.2

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        let textFieldText: NSString = textField.text ?? ""
        let txtAfterUpdate = textFieldText.stringByReplacingCharactersInRange(range, withString: string)
        callMyMethod(txtAfterUpdate)
    
        return true
    }
    
    func textFieldShouldClear(textField: UITextField) -> Bool {
        callMyMethod("")
        return true
    }
    

    Though the textField.text property is an optional, it cannot be set to nil. Setting it to nil is changed to empty string within UITextField. In the code above, that is why textFieldText is set to empty string if textField.text is nil (via the nil coalescing operator ??).

    Implementing textFieldShouldClear(_:) handles the case where the text field's clear button is visible and tapped.

    0 讨论(0)
  • 2020-12-07 18:10

    In Swift 3 it would look like this:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let text: NSString = (textField.text ?? "") as NSString
        let resultString = text.replacingCharacters(in: range, with: string)
    
        return true
    }
    
    0 讨论(0)
提交回复
热议问题