iphone - tipo - ¿Cómo descarta el teclado al editar un UITextField?
teclado iphone 7 (20)
Aquí hay un truco para obtener el comportamiento de descarte automático del teclado sin ningún código. En la punta, edite el objeto proxy Primer Respondedor en el inspector de Identidad, agregando una nueva acción de primera respuesta; llamémoslo dummy:
Ahora enganche el evento Did End on Exit del campo de texto al objeto dummy:
acción del objeto proxy Primer Respondedor. ¡Eso es! Dado que el evento Did End on Exit del campo de texto ahora tiene un par de acción y destino, el campo de texto descarta automáticamente su teclado cuando el usuario toca Return; y dado que no hay penalización por no encontrar un controlador para un mensaje enviado a la cadena de respuesta, la aplicación no se bloquea aunque no haya implementación de la dummy:
cualquier lugar.
Sé que tengo que decirle a mi UITextField que renuncie a la primera respuesta cuando quiero cerrar el teclado, pero no estoy seguro de cómo saber cuándo el usuario ha presionado la tecla "Listo" en el teclado. ¿Hay alguna notificación que pueda observar?
Cree una función hidekeyboard y vincúlela al campo de texto en el archivo .xib y seleccione DidEndOnExit
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
Cualquiera que busque Swift 3
1) Asegúrese de que el Delegado de UITextField esté conectado a su ViewController en el Guión Gráfico
2) Implementar UITextFieldDelegate en su archivo ViewController.Swift (por ejemplo, clase ViewController: UIViewController, UITextFieldDelegate {)
3) Usa el método delegado a continuación
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
En Swift puede escribir un IBAction en el Controlador y establecer el evento Did End On Exit del campo de texto para esa acción
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
Establecer programáticamente el delegado del UITextField en swift 3
Implemente UITextFieldDelegate en su archivo ViewController.Swift (por ejemplo, clase ViewController: UIViewController, UITextFieldDelegate {)
lazy var firstNameTF: UITextField = {
let firstname = UITextField()
firstname.placeholder = "FirstName"
firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
firstname.textAlignment = .center
firstname.borderStyle = UITextBorderStyle.roundedRect
firstname.keyboardType = UIKeyboardType.default
firstname.delegate = self
return firstname
}()
lazy var lastNameTF: UITextField = {
let lastname = UITextField()
lastname.placeholder = "LastName"
lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
lastname.textAlignment = .center
lastname.borderStyle = UITextBorderStyle.roundedRect
lastname.keyboardType = UIKeyboardType.default
lastname.delegate = self
return lastname
}()
lazy var emailIdTF: UITextField = {
let emailid = UITextField()
emailid.placeholder = "EmailId"
emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
emailid.textAlignment = .center
emailid.borderStyle = UITextBorderStyle.roundedRect
emailid.keyboardType = UIKeyboardType.default
emailid.delegate = self
return emailid
}()
// Marca: - manejo delegado textField ...
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == firstNameTF {
lastNameTF.becomeFirstResponder()
}
else if textField == lastNameTF {
emailIdTF.becomeFirstResponder()
}
else {
view.emailIdTF(true)
}
return true
}
Esto es lo que tuve que hacer para que funcione, y creo que es necesario para cualquiera que tenga un teclado numérico (o cualquier otro que no tenga un botón hecho):
- Cambié el UIView en el ViewController a un UIControl.
Creé una función llamada
-(IBAction)backgroundIsTapped:(id)sender
Esto también se definió en el archivo .h.
Después de esto, me vinculé al bit ''aterrizar'' para ViewController en Interface Builder.
En la función ''background is tapped'', puse esto:
[answerField resignFirstResponder];
Simplemente recuerde cambiar ''answerField'' por el nombre del UITextField del que desea eliminar el teclado (obviamente, asegúrese de que su UITextField se defina de la siguiente manera :)
IBOutlet UITextField * <nameoftextfieldhere>;
Sé que este tema probablemente murió hace mucho tiempo ... ¡pero espero que esto ayude a alguien, en algún lado!
Notará que el método "textFieldShouldReturn" proporciona el objeto de campo de texto que ha pulsado la tecla DONE. Si configura el TAG, puede activar ese campo de texto. O puede rastrear y comparar el puntero del objeto con algún valor de miembro almacenado por su creador.
Mi enfoque es el siguiente para un autoestudio:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
Mientras tanto, puse la prueba de "validación" que niega la renuncia que sigue. Es solo para ilustración, así que si el usuario escribe ¡NO! en el campo, no descartará. El comportamiento fue como yo quería, pero la secuencia de salida no fue la que esperaba.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
A continuación está mi salida NSLog para esta negación seguida de la aceptación. Notarás que estoy devolviendo el resultado de la renuncia, pero esperaba que me devolviera FALSO para informar a la persona que llama? Aparte de eso, tiene el comportamiento necesario.
13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 13.327 StudyKbd[109:207] NO! 13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard 59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO 59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
Si conecta el evento DidEndOnExit del campo de texto a una acción (IBAction) en InterfaceBuilder, se enviará un mensaje cuando el usuario cierre el teclado (con la tecla de retorno) y el remitente será una referencia al UITextField que disparó el evento.
Por ejemplo:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
Luego, en InterfaceBuilder, vincule el evento DidEndOnExit del campo de texto a esta acción en su controlador (o lo que sea que esté usando para vincular eventos desde la interfaz de usuario). Cada vez que el usuario ingresa texto y descarta el campo de texto, el controlador recibirá este mensaje.
Si ha creado la vista usando Interface Builder, use lo siguiente Solo cree un método,
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
Simplemente haga clic con el botón derecho en el campo de texto en la vista y establezca el evento como Did End on Exit y conéctelo al método "dismissKeyboard".
La mejor guía para principiantes es "Head First iPhone and iPad Development, 2nd Edition"
Solo agrega
[textField endEditing:YES];
donde desea desactivar el teclado y visualizar la vista del selector.
Swift 3, iOS 9+
@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}
También puedes crear un método en tu controlador
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
y luego en Connection Inspector en IB connect Evento "Did End On Exit".
También puedes usar
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
El mejor si tiene muchos Uitextfields:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
kubi, gracias. Tu código funcionó. Para ser explícito (para principiantes como), como dices, tienes que configurar el delegate
UITextField
para que sea igual al ViewController en el que reside el campo de texto. Puedes hacer esto donde quieras. Elegí el método viewDidLoad
.
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
prueba esto
- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"/n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
si quieres editar todo en un UIViewController puedes usarlo.
[[self view]endEditing:YES];
y si desea descartar un escondite de teclado UITextField perticular, entonces use.
1.add delegar en su viewcontroller.h
<UITextFieldDelegate>
hacer que la delegación no pueda en su campo de texto.
self.yourTextField.delegate = self;
agrega este método a tu viewcontroller.
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField resignFirstResponder]; devolver SÍ;}
Aquí hay una forma bastante limpia de finalizar la edición con la tecla de retorno o un toque en el fondo.
En el constructor Interfaz, incruste sus campos en una vista de clase UIFormView
Que hace esta clase?
- Se conecta automáticamente a sí mismo como campos delegados (ya sea que se haya despertado desde la punta, o se haya agregado manualmente)
- Mantenga una referencia en el campo editado actual
- Descartar el teclado al regresar o tocar en el fondo
Aquí está el código:
Interfaz
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
Implementación
#import "UIFormView.h"
@implementation UIFormView
{
UITextField* currentEditingTextField;
}
// Automatically register fields
-(void)addSubview:(UIView *)view
{
[super addSubview:view];
if ([view isKindOfClass:[UITextField class]]) {
if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
}
}
// UITextField Protocol
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
currentEditingTextField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
currentEditingTextField = NULL;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self endEdit];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self textFieldValueIsValid:textField]) {
[self endEdit];
return YES;
} else {
return NO;
}
}
// Own functions
-(void)endEdit
{
if (currentEditingTextField) {
[currentEditingTextField endEditing:YES];
currentEditingTextField = NULL;
}
}
// Override this in your subclass to handle eventual values that may prevent validation.
-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
return YES;
}
@end
Al subclasificar el formulario y reemplazar el método
textFieldValueIsValid:
puede evitar el final de la edición si el valor no es correcto para el campo dado.Si un campo tiene un delegado configurado en Interface Builder, entonces el formulario no lo cambia. No veo muchas razones para establecer un delegado diferente para un campo en particular, pero ¿por qué no ...
Hay muchas maneras de mejorar esta clase de vista de formulario: adjuntar un delegado, hacer un diseño, manejar cuando los teclados cubren un campo (utilizando el marco actualEditingTextField), iniciar automáticamente la edición para el siguiente campo, ...
Yo personalmente lo mantengo en mi marco, y siempre lo subclases para agregar características, con bastante frecuencia es útil "tal como está".
Espero que ayude Saludos a todos
Establecí el delegado del UITextField
en mi clase ViewController
.
En esa clase, implementé este método de la siguiente manera:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
//====================================================
// textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
if(textField.returnKeyType != UIReturnKeyDone){
[[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
}
return YES;
}
textField.returnKeyType = UIReturnKeyDone;