Así que tengo un UITextView que estoy usando para permitir al usuario enviar algún texto.

Mi problema es que me parece que no puede averiguar cómo permitir que el usuario ‘Cancelar’ tocando lejos de la UITextView.

InformationsquelleAutor tuzzolotron | 2009-09-21

10 Comentarios

  1. 107

    La simplificación de tuzzolotron la respuesta:
    Donde la siguiente toma de corriente está correctamente conectado en su xib

        IBOutlet UITextView *myTextView;

    El uso de esta en el controlador de vista:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UITouch *touch = [[event allTouches] anyObject];
        if ([myTextView isFirstResponder] && [touch view] != myTextView) {
            [myTextView resignFirstResponder];
        }
        [super touchesBegan:touches withEvent:event];
    }

    Un toque en la Vista del Controlador de la Vista, fuera de la Vista de Texto, renunciar a la primera respuesta, de cerrar el teclado.

    • Gran solución!
    • Yo estaría encantado de ayudar a los downvoter si esto no funciona para ellos.. solo deja un comentario o iniciar una nueva pregunta y el enlace aquí.
    • ohhorob, esta solución no funciona si hacemos clic en cualquier otro punto de venta en punto de vista, me puedes ayudar con eso?
    • WOW, gran solución, gracias.
    • En caso de que alguien todavía está buscando en esto… tengo un problema en la parte de mi raíz VISTA está cubierto por una UIScrollView. Si me toca en los márgenes directamente en el UIView, el teclado va a despedir, pero si me toca que UIScrollView, no.
  2. 30

    Otro enfoque que se utiliza mucho cuando se trabaja con UITableViews, barra de búsquedas y el teclado es este, creo que se puede aplicar al campo de texto

    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    [self.tableView addGestureRecognizer:gestureRecognizer];
    gestureRecognizer.cancelsTouchesInView = NO;  //this prevents the gesture recognizers to 'block' touches
    [gestureRecognizer release];

    Y entonces, he aquí la simple función de devolución de llamada

    - (void)hideKeyboard {
        [myTextField resignFirstResponder];
    }

    Espero que ayude

    • Usted puede agregar a [ver auto] si estás trabajando con un ViewController.
    • no no va a funcionar, tablas y rollos de vista tiene sus propias interacciones
    • Esta respuesta es la mejor.También se trabaja para un grupo de campos de texto en un scrollView cuando agrego tapGestureRecognizer a sí mismo.ver
    • Ya esta resuelto el problema. Aquí la clave está en la tercera línea, que permite a otros eventos de toque para suceder también (por no bloquear). Funciona bien con la tabla de puntos de vista también. (En mi caso, la barra de búsqueda se encuentra DENTRO de una vista de tabla de la célula, y esto no permite una toma de corriente. En este caso, se puede hacer self.view.endEditing(true) en lugar de resignFirstResponder.
  3. 7

    En mi opinión:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [touches anyObject];
    
        //pass touches up to viewController
        [self.nextResponder touchesBegan:touches withEvent:event];
    }

    En mi viewcontroller:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UITouch *touch = [[event allTouches] anyObject];
        if (keyboardShown && [touch view] != self.TextView) 
        {
             [self.TextView resignFirstResponder];
        }
        [super touchesBegan:touches withEvent:event];
    }
    
    - (void)keyboardWasShown:(NSNotification*)aNotification
    {    
            keyboardShown = YES;
    }
    • Hace este trabajo, o están preguntando nos fijamos en el código?
    • Esta es la solución que he implementado. Funciona.
    • ¿Cómo puedo añadir el touchesBegan método a una UITableView que me he hecho una subvista de sí mismo.vista de la UIViewController estoy trabajando en el. Tengo a la subclase UITableView, es decir, @interfaz TouchableTableView : UITableView? O, ¿hay una manera más fácil de hacerlo w/o subclases UITableView?
  4. 3

    Este es un viejo post, pero se me fue la implementación de esta solución cuando me encontré con algo mucho más sencillo (tal vez no estaba disponible en ese entonces).

    [auto.myTextView endEditing:YES];

    Estoy usando un UITableView, por lo que poner esta línea en el didSelectRowAtIndexPath: método.
    Tan lejos, tan buena…

  5. 2
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        var touch = event.allTouches()?.anyObject() as UITouch
    
        if( textfield.isFirstResponder() && touch.view != textfield) {
            textfield.resignFirstResponder()
            NSLog("Resigning first responder since touches began outside")
        }
    
        super.touchesBegan(touches, withEvent: event)
    }

    ohhorob la respuesta trabajó también para mí. Aquí está el simple swift equivalente.

  6. 2

    Aquí es el swift 3 código

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            if textField.isFirstResponder && touch.view != textField {
                textField.resignFirstResponder()
            }
        }
        super.touchesBegan(touches, with: event)
    }
  7. 1

    Aquí es una mejor solución que la que no depende de una toma de corriente y va a trabajar con cualquier número de UITextField objetos en el controlador.

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UITouch *touch = [[event allTouches] anyObject];
    
        if (![[touch view] isKindOfClass:[UITextField class]]) {
            [self.view endEditing:YES];
        }
        [super touchesBegan:touches withEvent:event];
    }
    • no creo que usted necesita para comprobar UITextField – incluso si usted endEditing: indiscriminadamente, conmutación entre campos de texto todavía funciona, el teclado hace permanecer hasta
  8. 1

    Muy fácil

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

    Yo quería una versión de este que trabajó para renunciando desde cualquier punto de vista, sin necesidad de puntos de venta para cada uno.. Aquí está mi solución, la que puse en uno de mis contenedor estándar vistas..

    Es el uso de MonoTouch C#, aunque debería ser obvio cómo convertir a Objective-C

        private void findAndResignFirstResponder(UIView node=null) {
            if (node == null) { return; }
            if (node.IsFirstResponder) {
                node.ResignFirstResponder();
                return;
            }
    
            foreach (UIView view in node.Subviews) {
                findAndResignFirstResponder(node:view);
            }
        }
    
        private bool haveDrag = false;
        public override void TouchesEnded(NSSet touches, UIEvent evt) {
            if (!haveDrag) {
                UITouch touch = (UITouch)evt.AllTouches.AnyObject;
                if (!touch.View.CanBecomeFirstResponder) {
                    this.findAndResignFirstResponder(this);
                    Console.WriteLine("resign");
                }
            }
            base.TouchesEnded (touches, evt);
        }
        public override void TouchesMoved(NSSet touches, UIEvent evt) {
            haveDrag = true;
            base.TouchesMoved (touches, evt);
        }
    
        public override void TouchesBegan(NSSet touches, UIEvent evt) {
            haveDrag = false;
            base.TouchesBegan (touches, evt);
        }
  10. 0

    Mi manera de hacerlo…

    • Agregar una referencia a la TextView en el @interfaz de su ViewController:

      @property (weak, nonatomic) IBOutlet UITextView *yourTextView;
    • Reemplazar este método en el @ejecución de su ViewController:

      - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
      {
          if ([self.yourTextView isFirstResponder]) {
            [self.yourTextView resignFirstResponder];
          }
      }

Dejar respuesta

Please enter your comment!
Please enter your name here