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.
- Se debe declarar UITextFieldDelegate en el controlador de Vista, es decir, en la clase SecondViewController:
- Las funciones de las funciones del detector myDebitDetector func myCreditDetector deben estar en la clase ViewController.
Aparecerán debit.addTarget y credit.addtarget en la vista.
@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)