web-dev-qa-db-ja.com

SwiftでどのようにChangeChangeCharactersInRangeが機能するのですか?

オンザフライ型検索を使用する方法としてshouldChangeCharactersInRangeを使用しています。

しかし、私は問題を抱えていますshouldChangeCharactersInRangeは、テキストフィールドが実際に更新される前に呼び出されます:

Objective Cでは、以下を使用してこれを解決しました。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    return YES;
}

しかし、私はこれをSwiftで書いてみました:

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
    let txtAfterUpdate:NSString = self.projectSearchTxtFld.text as NSString
    txtAfterUpdate.stringByReplacingCharactersInRange(range, withString: string)

    self.callMyMethod(txtAfterUpdate)
    return true
}

値を取得する前にメソッドが呼び出されますか?

66
Ryan

Swift 4、Swift 5

このメソッドはNSStringを使用しません

// MARK: - UITextFieldDelegate

extension MyViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {
        if let text = textField.text,
           let textRange = Range(range, in: text) {
           let updatedText = text.replacingCharacters(in: textRange,
                                                       with: string)
           myvalidator(text: updatedText)
        }
        return true
    }
}

注意。セキュリティで保護されたテキストフィールドを使用する場合は注意してください。

104
Vyacheslav

stringByReplacingCharactersInRangeは新しい文字列を返すので、次の方法はどうですか:

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
}
71
Mike Pollard

スイフト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
}

スイフト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
}

textField.textプロパティはオプションですが、nilに設定することはできません。 nilに設定すると、UITextField内の空の文字列に変更されます。上記のコードでは、textField.textがnilの場合(nil合体演算子??を介して)textFieldTextが空の文字列に設定される理由です。

textFieldShouldClear(_:)を実装すると、テキストフィールドのクリアボタンが表示され、タップされる場合が処理されます。

40
Mobile Dan

Swiftでは、次のようになります。

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
}
11
Andrey Gordeev

スイフト3


ユーザーが入力または貼り付けた文字を前処理する場合、次のソリューションは魅力のように機能します

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
}

ここで見つけてください: https://Gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047

0
blackjacx