ios - ¿Cómo verifico cuando un UITextField cambia?
uitextfielddelegate (16)
Swift 3.0
textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
y método de manejo:
func textFieldDidChange(textField: UITextField) {
}
Swift 4.0
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
y método de manejo:
@objc func textFieldDidChange(_ textField: UITextField) {
}
Swift 5.0
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: UIControl.Event.editingChanged)
y método de manejo:
@objc func textFieldDidChange(_ textField: UITextField) {
}
Estoy tratando de verificar cuándo cambia un campo de texto, equivalente también a la función utilizada para textView -
textViewDidChange
hasta ahora he hecho esto:
func textFieldDidBeginEditing(textField: UITextField) {
if self.status.text == "" && self.username.text == "" {
self.topRightButton.enabled = false
} else {
self.topRightButton.enabled = true
}
}
¿Qué tipo de trabajo funciona, pero el
topRightButton
se habilita tan pronto como se presiona el campo de texto, quiero que se habilite solo cuando el texto se escriba realmente?
Así es como puede agregar un
textField text change listener
usando
Swift 3
:
UITextFieldDelegate
tu clase como
UITextFieldDelegate
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}
Luego, tradicionalmente agregue una función textFieldShouldEndEditing:
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
return true
}
Debes seguir estos pasos:
- Hacer una referencia de salida al campo de texto
- AssignUITextFieldDelegate a la clase de controlador
- Configure yourTextField.delegate
- Implemente cualquier función que necesite
Código de muestra:
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
}
.
.
.
}
La forma en que lo he manejado hasta ahora: en
UITextFieldDelegate
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
}
Versión Swift4
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
return true
}
Puede hacer esta conexión en el generador de interfaces.
-
En su guión gráfico, haga clic en el editor asistente en la parte superior de la pantalla (dos círculos en el medio).
-
Ctrl + clic en el campo de texto en el generador de interfaces.
-
Arrastre desde EditingChanged al interior de su clase de controlador de vista en la vista de asistente.
-
Asigne un nombre a su función ("textDidChange", por ejemplo) y haga clic en conectar.
Puede usar este método delegado de UITextFieldDelegate. Se dispara con cada cambio de personaje.
(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)
Sin embargo, ESTO SÓLO DISPONE ANTES DE QUE SE HAGA UN CAMBIO (de hecho, solo se hace un cambio si devuelve verdadero desde aquí).
Swift 3
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)
crear nueva clase personalizada 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
}
}
textField(_:shouldChangeCharactersIn:replacementString:) funcionó para mí en Xcode 8, Swift 3 si desea verificar cada pulsación de tecla.
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
}
¿Quizás usar RxSwift?
necesitar
pod ''RxSwift'', ''~> 3.0''
pod ''RxCocoa'', ''~> 3.0''
agregar importaciones obviamente
import RxSwift
import RxCocoa
Entonces tienes un campo de
textfield : UITextField
let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
onNext: {(string: String?) in
print(string!)
})
U tiene otros 3 métodos.
- onError
- onCompleted
- onDisposed
- En el siguiente
RÁPIDO
Swift 4.2
textfield.addTarget(self, action: #selector(ViewControllerr.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)
y
@objc func textFieldDidChange(_ textField: UITextField) {
}
SWIFT 3 y swift 4.1
textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
y
func textFieldDidChange(_ textField: UITextField) {
}
SWIFT 2.2
textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
y
func textFieldDidChange(textField: UITextField) {
//your code
}
C OBJETIVO
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
y el método textFieldDidChange es
-(void)textFieldDidChange :(UITextField *) textField{
//your code
}
Swift 3.0.1+ (Algunas de las otras respuestas de swift 3.0 no están actualizadas)
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
func textFieldDidChange(_ textField: UITextField) {
}
Swift 4
Conforme a 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
}
Swift 4
textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)
@objc func textIsChanging(_ textField:UITextField) {
print ("TextField is changing")
}
Si desea realizar un cambio una vez que el usuario ha ingresado completamente (se llamará una vez que el usuario cierre el teclado o presione Intro).
textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)
@objc func textDidChange(_ textField:UITextField) {
print ("TextField did changed")
}
rápido 4
En viewDidLoad ():
//ADD BUTTON TO DISMISS KEYBOARD
// Init a keyboard toolbar
let toolbar = UIView(frame: CGRect(x: 0, y: view.frame.size.height+44, width: view.frame.size.width, height: 44))
toolbar.backgroundColor = UIColor.clear
// Add done button
let doneButt = UIButton(frame: CGRect(x: toolbar.frame.size.width - 60, y: 0, width: 44, height: 44))
doneButt.setTitle("Done", for: .normal)
doneButt.setTitleColor(MAIN_COLOR, for: .normal)
doneButt.titleLabel?.font = UIFont(name: "Titillium-Semibold", size: 13)
doneButt.addTarget(self, action: #selector(dismissKeyboard), for: .touchUpInside)
toolbar.addSubview(doneButt)
USDTextField.inputAccessoryView = toolbar
Agregue esta función:
@objc func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}
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 = ""
}
}