ios - quitar - swift esconder teclado




iOS-Descartar el teclado al tocar fuera de UITextField (20)

Me pregunto cómo hacer que el teclado desaparezca cuando el usuario toca fuera de un UITextField .


Esto funciona

En este ejemplo, aTextField es el único UITextField ... Si hay otros o UITextViews, hay un poco más que hacer.

// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end

// YourViewController.m

@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...

@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...

- (void)viewDidLoad
{
    [super viewDidLoad];
    // your other init code here
    [self.view addGestureRecognizer:self.singleTapRecognizer];

{

- (UITapGestureRecognizer *)singleTapRecognizer
{
    if (nil == _singleTapRecognizer) {
        _singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
        _singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
    }
    return _singleTapRecognizer;
}

// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
    NSLog(@"singleTap");
    [self hideKeyboard:sender];
}

// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
    NSLog(@"Return pressed");
    [self hideKeyboard:textField];
    return YES;
}

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    [aTextField resignFirstResponder];
    NSLog(@"keyboard hidden");
}

¿Qué tal esto? Sé que este es un post viejo. Podría ayudar a alguien :)

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
    NSArray *subviews = [self.view subviews];
    for (id objects in subviews) {
        if ([objects isKindOfClass:[UITextField class]]) {
            UITextField *theTextField = objects;
            if ([objects isFirstResponder]) {
                [theTextField resignFirstResponder];
            }
        } 
    }
}

Comprueba esto, esta sería la forma más fácil de hacerlo,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
      [self.view endEditing:YES];// this will do the trick
}

O

Esta biblioteca se encargará de incluir el desplazamiento automático de la barra de desplazamiento, tocar el espacio para ocultar el teclado, etc.

https://github.com/michaeltyson/TPKeyboardAvoiding


Creo que la forma más fácil (y mejor) de hacer esto es subclasificar su vista global y usar el hitTest:withEvent para escuchar cualquier toque. Los toques en el teclado no están registrados, por lo que hitTest: withEvent solo se llama cuando toca / scroll / swipe / pinch ... en otra parte, luego llame a [self endEditing:YES] .

Esto es mejor que usar touchesBegan porque touchesBegan no se llama si hace clic en un botón en la parte superior de la vista. Es mejor que UITapGestureRecognizer que no puede reconocer un gesto de desplazamiento, por ejemplo. También es mejor que usar una pantalla oscura porque en una interfaz de usuario compleja y dinámica, no se puede colocar una pantalla oscura en todas partes. Además, no bloquea otras acciones, no es necesario tocar dos veces para seleccionar un botón externo (como en el caso de un UIPopover ).

Además, es mejor que llamar a [textField resignFirstResponder] , ya que puede tener muchos campos de texto en pantalla, por lo que esto funciona para todos ellos.


En este caso, se puede usar ScrollView y agregarlo a TextField en ScrollView y quiero Toque ScrollView y View y luego descartar el teclado. Traté de crear código de ejemplo por si acaso. Me gusta esto,

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
        view.addGestureRecognizer(tapGesture)
        // Do any additional setup after loading the view, typically from a nib.
    }
    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Tu guión gráfico Mira eso como.


Envíe el mensaje resignFirstResponder al resignFirstResponder de texto que lo puso allí. Por favor, consulte esta publicación para más información.



Esta es una buena solución genérica:

C objetivo:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];    
}

Rápido:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    self.view.endEditing(true)
}

Basado en la solución @icodebuster: https://.com/a/18756253/417652


Muchas respuestas geniales aquí sobre el uso de UITapGestureRecognizer cuales rompen el UITextField claro (X) de UITextField . La solución es suprimir el reconocedor de gestos a través de su delegado:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
    BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
    return !(touchViewIsButton && touchSuperviewIsTextField);
}

No es la solución más robusta pero funciona para mí.


Probé muchas de las respuestas aquí y no tuve suerte. Mi reconocedor de gestos de toques siempre hacía que mis UIButtons no respondieran cuando se pulsaban, incluso cuando establecía la propiedad cancelsTouchesInView del reconocedor de gestos en NO.

Esto es lo que eventualmente resolvió el problema:

Tener un ivar:

UITapGestureRecognizer *_keyboardDismissGestureRecognizer;

Cuando un campo de texto comienza a editarse, configure el reconocedor de gestos:

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    if(_keyboardDismissGestureRecognizer == nil)
    {
        _keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(dismissKeyboard)] autorelease];
        _keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;

        [self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
    }
}

Entonces el truco está en cómo configurar el método de despido de la pizarra:

- (void) dismissKeyboard
{
    [self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}

- (void) dismissKeyboardSelector
{
    [self.view endEditing:YES];

    [self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
    _keyboardDismissGestureRecognizer = nil;
}

Supongo que hay algo acerca de cómo obtener la ejecución de desperdicio de pantalla de la pila de ejecución de manejo táctil ...


Puede usar el método UITapGestureRecongnizer para descartar el teclado haciendo clic fuera de UITextField. Al usar este método cada vez que el usuario haga clic fuera de UITextField, el teclado se cerrará. A continuación se muestra el fragmento de código para su uso.

 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self
                                   action:@selector(dismissk)];

    [self.view addGestureRecognizer:tap];


//Method
- (void) dismissk
{
    [abctextfield resignFirstResponder];
    [deftextfield resignFirstResponder];

}

Puedes hacer esto usando el Storyboard en XCode 6 y más:


Crea la acción para ocultar el teclado.

Agregue esto al archivo de encabezado de la clase utilizada por su ViewController:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

Luego agregue esto al archivo de implementación del mismo ViewController:

- (IBAction)dissmissKeyboardOnTap:(id)sender{
    [[self view]endEditing:YES];
}

Esta será ahora una de las 'Acciones recibidas' para la escena de su guión gráfico (por ejemplo, ViewController):


Conecta la acción al evento de usuario.

Ahora necesita conectar esta acción al gesto del usuario de tocar el teclado.

Importante: debe convertir el 'UIView' contenido en su guión gráfico a un UIControl , para que pueda recibir eventos. Seleccione la vista de la jerarquía de escenas de View Controller:

... y cambia su clase:

Ahora arrastre desde el pequeño círculo al lado de la 'acción recibida' para su escena, a una parte 'vacía' de su escena (en realidad, está arrastrando la 'Acción recibida' a la UIControl). Se le mostrará una selección de eventos a los que puede conectar su acción para:

Seleccione la opción 'retocar dentro'. Ahora ha enganchado la acción IBA que creó a una acción del usuario de tocar el teclado. Cuando el usuario toca el teclado, ahora estará oculto.

(NOTA: para enlazar la acción al evento, también puede arrastrar desde la acción recibida directamente al UIControl en su jerarquía de Controladores de Vista. Se muestra como 'Control' en la jerarquía.)


Si lo entiendo bien, usted quiere renunciar al tecleado del teclado en la parte exterior del textfield de textfield pero no tiene referencia de su campo de textfield .

Prueba esto;

  • Toma global textField, llamémoslo reftextField
  • Ahora, en textFieldDidBeginEditing ajuste el campo de texto referenciado a

    - (void) textFieldDidBeginEditing:(UITextField *)textField{
        reftextField = textField;
    }
    
  • Ahora puede usarlo alegremente en cualquier reloj de botón (agregando un botón transparente para comenzar la edición recomendada)

    - (void)dismissKeyboard {
          [reftextField resignFirstResponder];
    }
    
  • O para renunciar al botón hecho intente esto.

    //for resigning on done button    
    - (BOOL) textFieldShouldReturn:(UITextField *)textField{
        [textField resignFirstResponder];
        return YES;
    }
    

Solo para agregar a la lista aquí mi versión de cómo descartar un teclado con un toque externo.

viewDidLoad:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

En cualquier sitio:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [textFieldName resignFirstResponder];
    puts("Dismissed the keyboard");
}

Una de las maneras más fáciles y cortas es agregar este código a su viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];

Utilicé el ejemplo de Barry para mi nuevo desarrollo. ¡Funcionó muy bien! pero tuve que incluir un pequeño cambio, requerido para descartar el teclado solo para el campo de texto que se está editando.

Entonces, agregué a Barry el siguiente ejemplo:

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    _textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
    _textBeingEdited = nil;
}

Además, cambié el método hideKeyboard de la siguiente manera:

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    //UITextField * tf = (UITextField *) sender;
    [_textBeingEdited resignFirstResponder];
}

Versión Swift, esto funciona en combinación con otros elementos (como un UIButton u otro UITextField ):

override func viewDidLoad() {
    super.viewDidLoad()

    let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
    tapper.cancelsTouchesInView = false
    view.addGestureRecognizer(tapper)
}

Versión rápida de la respuesta de @Jensen2k:

let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

Un trazador de líneas

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))

- (void)viewDidLoad
{
    [super viewDidLoad]; 

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
                                                          initWithTarget:self
                                                          action:@selector(handleSingleTap:)];
    [singleTapGestureRecognizer setNumberOfTapsRequired:1];
    [singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];

    [self.view addGestureRecognizer:singleTapGestureRecognizer];
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    [self.view endEditing:YES];
    [textField resignFirstResponder];
    [scrollView setContentOffset:CGPointMake(0, -40) animated:YES];

}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
     view.endEditing(true)

     }
}




uikit