ios uitextfield touch-up-inside

iOS/Swift: cómo detectar la acción táctil en un UITextField



touch-up-inside (9)

Me gustaría detectar la acción táctil en un UITextField.

Parece que la acción "Retocar el interior" no se activa al tocar dentro del campo de texto.


Actualización para Swift 3

Aquí está el código para Swift 3:

myTextField.addTarget(self, action: #selector(myTargetFunction), for: .touchDown)

Esta es la función:

func myTargetFunction() { print("It works!") }


Swift 4:

class ViewController: UIViewController, UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { if textField == myTextField { print("You edit myTextField") } } }

Esta es una función de delegado.


Establezca el delegado de UITextField en su controlador de vista, implemente el método de delegado

-(void)textField:(UITextField*)textField didBeginEditing { // User touched textField }


Me referí a la documentación de UIControlEvents de Apple y se me ocurrió lo siguiente:

Primero agregue UITextFieldDelegate a su clase y luego

textBox.delegate = self textBox.addTarget(self, action: #selector(TextBoxOn(_:)),for: .editingDidBegin) textBox.addTarget(self, action: #selector(TextBoxOff(_:)),for: .editingDidEnd)

Con las siguientes funciones:

func TextBoxOff(_ textField: UITextField) { code } } func TextBox(_ textField: UITextField) { code } }


Para Swift 3.1:

1) Crear un reconocedor de gestos:

let textViewRecognizer = UITapGestureRecognizer()

2) Agregar un controlador al reconocedor:

textViewRecognizer.addTarget(self, action: #selector(tappedTextView(_:)))

3) Agregue el reconocedor a su vista de texto:

textView.addGestureRecognizer(textViewRecognizer)

4) Agregue el controlador a su clase:

func tappedTextView(_ sender: UITapGestureRecognizer) { print("detected tap!") }


Para hacer esto un poco más claro, estas cosas deben estar en su lugar. Utilicé esto para hacerlo así que si un usuario ingresó algo en una aplicación de mi propio campo de texto de crédito, se eliminará cualquier cosa en el campo de débito.

  1. Se debe declarar UITextFieldDelegate en el controlador de Vista, es decir, en la clase SecondViewController:
  2. Las funciones de las funciones del detector myDebitDetector func myCreditDetector deben estar en la clase ViewController.
  3. Aparecerán debit.addTarget y credit.addtarget en la vista.

  4. @IBOutlet weak var debit: UITextField! y @IBOutlet weak var credit: UITextField! Son campos de texto en el guión gráfico y conectados al viewController.

    clase SecondViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    @IBOutlet weak var credit: UITextField! @IBOutlet weak var debit: UITextField! func myDebitDetector(textfield: UITextField ){ print("using debit") credit.text = "" } func myCreditDetector(textfield: UITextField) { print("using cedit") debit.text = "" } override func viewWillAppear(animated: Bool) { debit.addTarget(self, action: "myDebitDetector:", forControlEvents: UIControlEvents.TouchDown) credit.addTarget(self, action: "myCreditDetector:", forControlEvents: UIControlEvents.TouchDown) .... } }


Parece que "Touch Up Inside" no está habilitado para UiTextField, pero "Touch Down" funciona.

Así que la solución es la siguiente:

myTextField.addTarget(self, action: #selector(myTargetFunction), for: UIControlEvents.touchDown) @objc func myTargetFunction(textField: UITextField) { print("myTargetFunction") }


aquí está Swfit:

y no necesita usar el "touchUpInside", solo use los métodos de delegado así:

Haz que tu controlador View sea un delegado:

class ViewController: UIViewController, UITextFieldDelegate{ func textFieldDidBeginEditing(textField: UITextField) -> Bool { if textField == myTextField { return true // myTextField was touched } }

Aquí están los otros métodos de delegado:

protocol UITextFieldDelegate : NSObjectProtocol { optional func textFieldShouldBeginEditing(textField: UITextField) -> Bool // return NO to disallow editing. optional func textFieldDidBeginEditing(textField: UITextField) // became first responder optional func textFieldShouldEndEditing(textField: UITextField) -> Bool // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end optional func textFieldDidEndEditing(textField: UITextField) // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called optional func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool // return NO to not change text optional func textFieldShouldClear(textField: UITextField) -> Bool // called when clear button pressed. return NO to ignore (no notifications) optional func textFieldShouldReturn(textField: UITextField) -> Bool // called when ''return'' key pressed. return NO to ignore. }

de documentos rápidos:

struct UIControlEvents : RawOptionSetType { init(_ rawValue: UInt) init(rawValue: UInt) static var TouchDown: UIControlEvents { get } // on all touch downs static var TouchDownRepeat: UIControlEvents { get } // on multiple touchdowns (tap count > 1) static var TouchDragInside: UIControlEvents { get } static var TouchDragOutside: UIControlEvents { get } static var TouchDragEnter: UIControlEvents { get } static var TouchDragExit: UIControlEvents { get } static var TouchUpInside: UIControlEvents { get } static var TouchUpOutside: UIControlEvents { get } static var TouchCancel: UIControlEvents { get } static var ValueChanged: UIControlEvents { get } // sliders, etc. static var EditingDidBegin: UIControlEvents { get } // UITextField static var EditingChanged: UIControlEvents { get } static var EditingDidEnd: UIControlEvents { get } static var EditingDidEndOnExit: UIControlEvents { get } // ''return key'' ending editing static var AllTouchEvents: UIControlEvents { get } // for touch events static var AllEditingEvents: UIControlEvents { get } // for UITextField static var ApplicationReserved: UIControlEvents { get } // range available for application use static var SystemReserved: UIControlEvents { get } // range reserved for internal framework use static var AllEvents: UIControlEvents { get } }

UITextField no responde a la vista "touchUpInside" en el lado derecho, encontrará que es aceptable controlar los eventos


Versión Swift 3.0:

textFieldClientName.addTarget(self, action: Selector(("myTargetFunction:")), for: UIControlEvents.touchDown)