web-dev-qa-db-ger.com

Wie überprüfe ich, wann sich ein UITextField ändert?

Ich versuche zu prüfen, wann sich ein Textfeld ändert. Entspricht auch der für textView verwendeten Funktion - textViewDidChange. Bisher habe ich Folgendes getan: 

  func textFieldDidBeginEditing(textField: UITextField) {
        if self.status.text == "" && self.username.text == "" {
            self.topRightButton.enabled = false
        } else {   
            self.topRightButton.enabled = true
        }
    }

Welche Art von Arbeiten, aber die topRightButton ist aktiviert, sobald das Textfeld gedrückt wird. Ich möchte, dass es nur aktiviert wird, wenn Text tatsächlich eingegeben wird?

205
user4184036

Swift

textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)

Dann können Sie einfach Ihre Funktion aufrufen!

func textFieldDidChange(textField: UITextField) {
    //your code
}

Swift 2.2

textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

und

func textFieldDidChange(textField: UITextField) {
    //your code
}

Swift 3 & Swift 4.1

textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

und

func textFieldDidChange(_ textField: UITextField) {

}

Swift 4

@objc func textFieldDidChange(_ textField: UITextField) {

}

ZIEL C

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

und die textFieldDidChange-Methode ist

-(void)textFieldDidChange :(UITextField *) textField{
    //your code
}
566
Fawad Masud

Sie können diese Verbindung im Interface Builder herstellen.

  1. Klicken Sie in Ihrem Storyboard auf den Assistenten-Editor oben auf dem Bildschirm (zwei Kreise in der Mitte) .  Assistant editor selected

  2. Strg + Klicken Sie auf das Textfeld im Interface Builder.

  3. Ziehen Sie von EditingChanged in die Ansichts-Controller-Klasse in der Assistentenansicht .  Making connection

  4. Benennen Sie Ihre Funktion ("textDidChange" zum Beispiel) und klicken Sie auf connect .  Naming function

103
rmooney

Swift 3.0

textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

und Methode behandeln:

func textFieldDidChange(textField: UITextField) { 

}

Swift 4.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

und Methode behandeln:

@objc func textFieldDidChange(_ textField: UITextField) {

}
41
Robert

So habe ich es bisher gemacht: in UITextViewDelegate

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
    // text hasn't changed yet, you have to compute the text AFTER the edit yourself
    let updatedString = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string)

    // do whatever you need with this updated string (your code)


    // always return true so that changes propagate
    return true
}

Swift4-Version 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
    return true
}
19
Vinzzz

Swift 3

 textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)
14

Swift 3.0.1+ (Einige der anderen Swift 3.0-Antworten sind nicht auf dem neuesten Stand.)

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

func textFieldDidChange(_ textField: UITextField) {

}
7
aviran

textField (_: shouldChangeCharactersIn: replacementString :) arbeitete für mich in Xcode 8, Swift 3, wenn Sie jeden Tastendruck überprüfen möchten.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // Whatever code you want to run here.
    // Keep in mind that the textfield hasn't yet been updated,
    // so use 'string' instead of 'textField.text' if you want to
    // access the string the textfield will have after a user presses a key

    var statusText = self.status.text
    var usernameText = self.username.text

    switch textField{
    case self.status:
        statusText = string
    case self.username:
        usernameText = string
    default:
        break
    }

    if statusText == "" && usernameText == "" {
        self.topRightButton.enabled = false
    } else {   
        self.topRightButton.enabled = true
    }

    //Return false if you don't want the textfield to be updated
    return true
}
5
radthemad4

Swift 4

Konform zu UITextFieldDelegate .

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // figure out what the new string will be after the pending edit
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)

    // Do whatever you want here


    // Return true so that the change happens
    return true
}
5
drewster

Sie können diese Delegatmethode in UITextFieldDelegate verwenden. Es wird mit jedem Zeichenwechsel ausgelöst.

(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)

DIESE NUR ERFÄHRT , BEVOR eine Änderung vorgenommen wird (tatsächlich wird eine Änderung nur vorgenommen, wenn Sie von hier aus wahr zurückgeben).

4
Abubakr Dar

Swift 4

textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)

@objc func textIsChanging(_ textField:UITextField) {

 print ("TextField is changing")

}

Wenn Sie eine Änderung vornehmen möchten, nachdem der Benutzer vollständig eingegeben hat (Er wird aufgerufen, sobald der Benutzer die Tastatur verwirft oder die Eingabetaste drückt).

textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)

 @objc func textDidChange(_ textField:UITextField) {

       print ("TextField did changed") 
 }
1
Anamika

Vielleicht RxSwift verwenden?

brauchen

pod 'RxSwift',    '~> 3.0'
pod 'RxCocoa',    '~> 3.0'

importe natürlich hinzufügen

import RxSwift
import RxCocoa

Du hast also einen textfield : UITextField

let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
            onNext: {(string: String?) in
                print(string!)
        })

U hat andere 3 Methoden ..

  1. onError
  2. onCompleted
  3. onDisposed
  4. onNext
1
marlonpya

Sie sollten diesen Schritten folgen:

  1. Stellen Sie einen Outlet-Verweis auf das Textfeld her
  2. AssignUITextFieldDelegate der Controller-Klasse 
  3. Konfigurieren Sie yourTextField.delegate
  4. Implementieren Sie alle Funktionen, die Sie benötigen

Beispielcode:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var yourTextFiled : UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        yourTextFiled.delegate = self
    }


    func textFieldDidEndEditing(_ textField: UITextField) {
        // your code
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // your code
    }

    .
    .
    .
}
1
M.Hazara
txf_Subject.addTarget(self, action:#selector(didChangeFirstText), for: .editingChanged)

@objc func didChangeText(textField:UITextField) {
    let str = textField.text
    if(str?.contains(" "))!{
        let newstr = str?.replacingOccurrences(of: " ", with: "")
        textField.text = newstr
    }
}

@objc func didChangeFirstText(textField:UITextField) {
    if(textField.text == " "){
        textField.text = ""
    }
}
1
Yogesh Tandel

erstellen Sie eine neue benutzerdefinierte Klasse MaterialTextfield.Swift

class MaterialTextfield: UITextField,UITextFieldDelegate {

var bottomBorder = UIView()
var shouldShowEditing = false

override func awakeFromNib() {

    // Setup Bottom-Border

    self.delegate = self
    self.translatesAutoresizingMaskIntoConstraints = false

    bottomBorder = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
    bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1) // Set Border-Color
    bottomBorder.translatesAutoresizingMaskIntoConstraints = false

    addSubview(bottomBorder)

    bottomBorder.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    bottomBorder.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    bottomBorder.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
    bottomBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true // Set Border-Strength

}
@IBInspectable var hasError: Bool = false {
    didSet {
        if (hasError) {
            bottomBorder.backgroundColor = UIColor.red//error color
        } else {
            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
        }

    }
}
@IBInspectable var showEditing: Bool = false{
    didSet {
        if (showEditing) {
            bottomBorder.backgroundColor = UIColor(rgb: 0x56B5CA)//active color
        } else {
            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
        }

    }

}

func textFieldDidBeginEditing(_ textField: UITextField) {//listen to on edit event
    showEditing = !self.showEditing
}
func textFieldDidEndEditing(_ textField: UITextField) {//listen to on end edit event
    showEditing = !self.showEditing
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {//listen to return button event
    textField.resignFirstResponder() // return button will close keyboard
    return true
}

}
0
Muhammad Asyraf

So fügen Sie einen textField text change listener mit Swift 3 hinzu:

Deklarieren Sie Ihre Klasse als UITextFieldDelegate

override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self

    textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}

Fügen Sie dann einfach eine Funktion textFieldShouldEndEditing hinzu:

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
        return true 
}
0
Satnam Sync