IB de la biblioteca, la introducción nos dice que cuando el regresar se pulsa la tecla, el teclado para UITextView desaparecerá. Pero en realidad el regresar clave sólo puede actuar como ‘\n’.

Puedo agregar un botón y utilice el [txtView resignFirstResponder] para ocultar el teclado.

Pero hay una manera de agregar la acción de la regresar tecla en el teclado, por lo que yo no necesito agregar UIButton?

InformationsquelleAutor Chilly Zhong | 2009-04-01

33 Comentarios

  1. 344

    UITextView no tiene los métodos que será llamado cuando el usuario pulsa la tecla de retorno. Si desea que el usuario pueda agregar sólo una línea de texto, el uso de un UITextField. Golpear el retorno y ocultar el teclado para un UITextView no siga las directrices de interfaz.

    Incluso entonces, si usted quiere hacer esto, la implementación de las textView:shouldChangeTextInRange:replacementText: método de UITextViewDelegate y en la que comprobar si el texto de reemplazo es \n, ocultar el teclado.

    Hay otras maneras pero yo no soy consciente de ninguna.

    • Gracias y que el método funciona bien. La razón para utilizar UITextView es que pueden contener texto en varias líneas. Y ahora que lo estoy usando como un cuadro de mensaje.
    • Es bastante fácil para cambiar la tecla de retorno para «hacerse» con el [textField setReturnKeyType: UIReturnKeyDone]; o usando la interfaz del generador de
    • Bien, ahora entiendo que la Manzana en forma de terminar con un texto de varias líneas de campo es agregar hecho a la barra de menú
    • Vea a continuación; el uso de la UITextViewDelegate método textView:shouldChangeTextInRange:replacementText:. Funciona a la perfección.
    • Esto no es una buena manera de resolver esto porque estás limitando usuario pulse enter para salir del teclado. Probablemente, la mejor manera es agregar un botón que ejecute resignFirstResponder método.
    • Trate de usar el UIKeyboard accesorio de ver y agregar un botón que renuncie el teclado.
    • Parece que la configuración de la tecla de retorno para «hacer» no resuelve el problema en Xcode 6.4 , Swift 2.0. Me puse la clave con IB.
    • Gracias! A pesar de que salen de HIG este se ajusta a mi caso de uso perfectamente porque el TextView tenía a 1) ser capaz de mostrar texto ajustado 2) no permitir multi-línea de introducir el texto.

  2. 488

    Pensé que iba a publicar el fragmento de código a la derecha aquí en su lugar:

    Asegúrese de declarar el apoyo para la UITextViewDelegate protocolo.

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    
        if([text isEqualToString:@"\n"]) {
            [textView resignFirstResponder];
            return NO;
        }
    
        return YES;
    }

    Swift 4.0 actualización:

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            textView.resignFirstResponder()
            return false
        }
        return true
    }
    • El problema es que esto no es realmente una forma de detectar que el usuario ha aprovechado el retorno clave. El usuario puede pegar un carácter de retorno en el campo de texto y se obtendría el mismo delegado mensaje. Básicamente estás haciendo mal uso de la vista de texto. La manera de despedir el teclado es (1) no en todos (como cuando se redacta un mensaje en la aplicación de Correo) o (2) tener un botón Hecho en otros lugares de la interfaz (como en la aplicación de Notas). Usted puede conectar un botón como un accesorio de la vista del teclado, por ejemplo.
    • No funciona en el iPad.
    • Sam V que el fragmento se enfríe hombre. a mí me funciona. un millón de gracias hombre. ¿Hay algún fragmento de dissmisal de teclado numérico. se refiere a shishir
    • Sí, funciona en el iPad. Sólo lo intentó.
    • Magnífico. Sólo un recordatorio de que en algunas situaciones, para deshacerse de el teclado, intente lo largo de las líneas… [auto.ver endEditing:YES];
    • funciona bien en el iPad. Usted probablemente no establecer el delegado.
    • El problema es que el teclado se puede ocultar parte de la interfaz que se utiliza para descartar. Es realmente absurdo que IOS no tiene un botón en cada teclado dedicado para despedir el teclado para que el usuario pueda hacer, si así lo desea.
    • También cuando un botón de retroceso se cambia a un botón hecho. Debe actuar como un botón hecho y no una nueva línea de botón.
    • Funciona en emulador? La mía ya establecido con el delegado, pero no funciona bien en el emulador.

  3. 74

    Sé que esto ha sido contestado ya, pero no me gusta mucho usar el literal de cadena para la nueva línea así que aquí es lo que yo hice.

    - (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
        if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
            return YES;
        }
    
        [txtView resignFirstResponder];
        return NO;
    }

    Swift 4.0 actualización:

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
        return true
    }
    txtView.resignFirstResponder()
    return false
    }
    • Yo podría modificar de esta manera: NSRange resultRange = [texto rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] opciones:NSBackwardsSearch]; Debido a que este es un hack de todos modos, parece que la comprobación de la final de la cadena para un retorno podría ser una ruta más segura.
    • Muy buen comentario. También, es mejor para comprobar contra sustituye el texto, por ejemplo,NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text].
    • Imagina que un usuario pegar texto copiado de otro lado, que contiene en una nueva línea. Probablemente serían confundidos cuando en lugar de anexar el texto de la aplicación descarta el teclado.
  4. 42

    Sé que esto ha sido contestado un montón de veces, pero aquí están mis dos centavos a la cuestión.

    He encontrado las respuestas por samvermette y ribeto realmente útil, y también el comentario por maxpower en el ribeto‘s respuesta. Pero hay un problema con los enfoques. El problema que matt menciona en el samvermette‘s respuesta y es que si el usuario quiere pegar algo con un salto de línea dentro de ella, el teclado se escondía sin pegar nada.

    Así que mi enfoque es una mezcla de las tres mencionadas soluciones y sólo la comprobación de si la cadena introducida es una nueva línea cuando la longitud de la cadena es 1 así que asegúrese de que el usuario está escribiendo en lugar de pegar.

    Aquí es lo que he hecho:

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
        NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
        if ([text length] == 1 && resultRange.location != NSNotFound) {
            [textView resignFirstResponder];
            return NO;
        }
    
        return YES;
    }
    • Esta es una mejor solución para este problema. samvermette respuesta no tiene en cuenta la situación en la que el usuario desea pegar el texto.
    • ¿Cómo es en Swift?
  5. 36

    Una forma más elegante es despedir el teclado cuando el usuario toca en algún lugar fuera de el teclado del marco.

    Primero, establece en su ViewController, la vista de la clase «UIControl» en la identidad del inspector en UIBuilder. Control y arrastre el punto de vista en el ViewController de encabezado del archivo y el enlace como una acción con el evento, como Toque de Interior, tales como:

    ViewController.h

    -(IBAction)dismissKeyboardOnTap:(id)sender;

    En el principal ViewController archivo ViewController.m:

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

    Puede requerir un doble toque o toque largo usando técnicas similares. Puede que necesite configurar su ViewController a ser un UITextViewDelegate y conecte el TextView para el ViewController. Este método funciona para ambos UITextView y UITextField.

    Fuente: Big Nerd Ranch

    EDIT: también me gustaría añadir que si usted está usando un UIScrollView, la técnica anterior puede no funcionar tan fácilmente a través de la Interface Builder. En ese caso, usted podría usar un UIGestureRecognizer y llamar a la [[ver auto] endEditing:SÍ] método dentro de ella. Un ejemplo sería:

    -(void)ViewDidLoad{
        ....
        UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] 
            initWithTarget:self action:@selector(tap:)];
        [self.view addGestureRecognizer: tapRec];
        ....
    }
    
    -(void)tap:(UITapGestureRecognizer *)tapRec{
        [[self view] endEditing: YES];
    }

    Cuando el usuario pulsa fuera del teclado y no toque una entrada de espacio, el teclado va a despedir.

    • Me gusta la idea con GestureRecognizer pero el gran problema es que todos los botones de control o en la vista ya no se puede hacer clic.
  6. 32

    Agregar este método en el controlador de vista.

    Swift:

    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            textView.resignFirstResponder()
            return false
        }
        return true
    }

    Este método también puede ser útil para usted:

    /**
    Dismiss keyboard when tapped outside the keyboard or textView
    
    :param: touches the touches
    :param: event   the related event
    */
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        if let touch = touches.anyObject() as? UITouch {
            if touch.phase == UITouchPhase.Began {
                textField?.resignFirstResponder()
            }
        }
    }
    • No olvides confirmar el protocolo de UITextViewDelegate 🙂
    • Yo no creo que sea una buena idea para reemplazar touchesBegan y no llamar super.touchesBegan(touches:withEvent:).
    • Para expresar la naturaleza simétrica de este código, usted debe escribir else { return true }.
    • no en todos los
    • No están de acuerdo en que es una situación simétrica, no sabes lo que quiero decir, usted no cree en el valor de semánticamente código correcto, o, …?
    • ha-ha

  7. 26
    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
        if([text isEqualToString:@"\n"])
            [textView resignFirstResponder];
        return YES;
    }
    
    yourtextView.delegate=self;

    También agregar UITextViewDelegate

    No olvides confirmar el protocolo de

    SI no agregar if([text isEqualToString:@"\n"]) no se puede editar

    • -1 Esto es sólo una peor versión de samvermette la respuesta. Te perdiste de regresar NO si el texto es igual a @"\n".
  8. 16

    Hay otra solución mientras se utiliza con uitextview,
    Usted puede agregar la barra de herramientas como InputAccessoryView en «textViewShouldBeginEditing», y desde esta barra de herramientas del botón hecho puede cerrar el teclado, el código es el siguiente:

    En viewDidLoad

    toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; //toolbar is uitoolbar object
    toolBar.barStyle = UIBarStyleBlackOpaque;
    UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnClickedDone:)];
    [toolBar setItems:[NSArray arrayWithObject:btnDone]];

    En textviewdelegate método

    - (BOOL)textViewShouldBeginEditing:(UITextView *)textView
    {
         [textView setInputAccessoryView:toolBar];
         return YES;
    }

    En la acción de Botón Hecho que está en la barra de herramientas es la siguiente:

    -(IBAction)btnClickedDone:(id)sender
    {
        [self.view endEditing:YES];
    }
  9. 13

    He encontrado la respuesta por josebama a ser la más completa y limpia respuesta disponible en este hilo.

    A continuación es la Swift 4 sintaxis es:

    func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
        let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
        if text.count == 1 && resultRange != nil {
            textView.resignFirstResponder()
            //Do any additional stuff here
            return false
        }
        return true
    }
    • El resultRange pretende comprobar si el texto sólo contiene saltos de línea que evita que el disco duro de código «\n».
  10. 6

    swift

    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            textView.resignFirstResponder()
        }
        return true
    }

    Cómo descartar teclado para UITextView con la tecla de retorno?

    • La única corto y solución de trabajo. Gracias.
    • Dónde está esa captura de pantalla?
  11. 6

    Utilización de la navegación controlador de host de un bar para despedir el teclado:

    en el .h archivo:

    UIBarButtonItem* dismissKeyboardButton;

    en el .m de archivo:

    - (void)viewDidLoad {
        dismissKeyboardButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard)];
    }
    
    -(void)textViewDidBeginEditing:(UITextView *)textView {
        self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
    }
    
    -(void)textFieldDidBeginEditing:(UITextField *)textField {
        self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
    }
    
    -(void)dismissKeyboard {
        [self.textField resignFirstResponder];
        [self.textView resignFirstResponder];
        //or replace this with your regular right button
        self.navigationItem.rightBarButtonItem = nil;
    }
  12. 5

    Al igual que matt comentario a samvermette, no me gusta la idea de detectar «\n» tampoco. El «retorno» la clave está ahí por una razón en UITextView, que es para ir a la siguiente línea de curso.

    La mejor solución, en mi opinión, es imitar el iPhone de mensaje de la aplicación – que es para agregar la barra de herramientas (botón y) en el teclado.

    Tengo el código de la siguiente entrada del blog:

    http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/

    Pasos:

    -Agregar la barra de herramientas para su archivo XIB – establecer la altura de 460

    -Añadir botón de barra de herramientas del elemento (si no se ha agregado). Si usted necesita para alinear derecha, también agregar flexible botón de la barra de elemento a XIB, y mueva el botón de barra de herramientas del elemento

    -Acción de crear ese vínculo de su elemento de botón a resignFirstResponder como sigue:

    - (IBAction)hideKeyboard:(id)sender {
        [yourUITextView resignFirstResponder];
    }

    Entonces:

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
    
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    }
    
    - (void)keyboardWillShow:(NSNotification *)notification {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3];
    
        CGRect frame = self.keyboardToolbar.frame;
        frame.origin.y = self.view.frame.size.height - 260.0;
        self.keyboardToolbar.frame = frame;
    
        [UIView commitAnimations];
    }
    
    - (void)keyboardWillHide:(NSNotification *)notification {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3];
    
        CGRect frame = self.keyboardToolbar.frame;
        frame.origin.y = self.view.frame.size.height;
        self.keyboardToolbar.frame = frame;
    
        [UIView commitAnimations];
    }
    • Fuera de tema. Mientras que su solución es elegante, no responde a la pregunta original: «Cómo descartar teclado para UITextView con la tecla de retorno?». Hay situaciones cuando UITextView se emplea para simular un ajuste UITextField, no para entrar en varias líneas.
    • Aunque es fuera de tema, es muy útil. Yo también quiero un UITextView para ser introducido con varias líneas y despedir teclado cuando quiero.
  13. 5

    Acaba de resolver este problema de una manera diferente.

    • Crear un botón que se coloca en el fondo
    • Desde el Atributo Inspector, cambiar el tipo de botón personalizado, y el que hace el botón transparente.
    • Ampliar el botón para cubrir la totalidad de la vista, y asegúrese de que el botón está detrás de todos los demás objetos. Manera fácil de hacer esto es para arrastrar el botón de la parte superior de la vista de lista en la Vista
    • De Control de arrastre el botón a la viewController.h archivo y crear una acción (Enviado Evento: Toque por Dentro) como :

      (IBAction)ExitKeyboard:(id)sender;
    • En ViewController.m debe verse como :

      (IBAction)ExitKeyboard:(id)sender {
          [self.view endEditing:TRUE];
      }
    • Ejecutar la aplicación, y cuando usted haga clic fuera de la TextView, el teclado desaparece
    • Se debe agregar también : -(void)textViewDidEndEditing:(UITextView *)textView { [auto.TextView resignFirstResponder]; }
  14. 5

    Agregar un observador en el viewDidLoad

    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];

    y, a continuación, utilice el selector para buscar «\n»

    -(void) textViewKeyPressed: (NSNotification*) notification {
    
      if ([[[notification object] text] hasSuffix:@"\n"])
      {
        [[notification object] resignFirstResponder];
      }
    }

    Se hace uso de «\n» y no específicamente de verificación para una tecla de retorno, pero creo que esto está bien.

    ACTUALIZACIÓN

    Ver ribto la respuesta de abajo que utiliza [NSCharacterSet newlineCharacterSet] en lugar de \n

    • Err se hace uso de \n y la tecla de retorno es la detección se basa en \n así que comprueba tecla de retorno. La única diferencia es que usted está utilizando las notificaciones en lugar de utilizar el textViewDelegates.
    • Ahora creo que la comprobación de [NSCharacterSet newlineCharacterSet] en lugar de \n podría ser una mejor manera de ir.
  15. 4

    Intente esto :

     - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
        if ([text isEqualToString:@"\n"]) {
            [self.view endEditing:YES];
        }
    
        return YES;
    
    }
  16. 4

    //Se puede usar este …

    El paso 1. El primer paso es asegurarse de que usted declarar el apoyo para la UITextViewDelegate protocolo. Esto se hace en el archivo de encabezado, como ejemplo, aquí está el encabezado de

    EditorController.h:

    @interface EditorController : UIViewController  {
      UITextView *messageTextView;
    }
    
    @property (nonatomic, retain) UITextView *messageTextView;
    
    @end

    El paso 2. A continuación, tendrá que registrar el controlador como el UITextView del delegado. Continuando con el ejemplo anterior, aquí es cómo he inicializar el UITextView con EditorController como el delegado …

    - (id) init {
        if (self = [super init]) {
            //define the area and location for the UITextView
            CGRect tfFrame = CGRectMake(10, 10, 300, 100);
            messageTextView = [[UITextView alloc] initWithFrame:tfFrame];
            //make sure that it is editable
            messageTextView.editable = YES;
    
            //add the controller as the delegate
            messageTextView.delegate = self;
        }

    El paso 3. Y ahora, la pieza final del rompecabezas es tomar medidas en respuesta a la shouldCahngeTextInRange mensaje de la siguiente manera:

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
      replacementText:(NSString *)text
    {
        //Any new character added is passed in as the "text" parameter
        if ([text isEqualToString:@"\n"]) {
            //Be sure to test for equality using the "isEqualToString" message
            [textView resignFirstResponder];
    
            //Return FALSE so that the final '\n' character doesn't get added
            return FALSE;
        }
        //For any other character return TRUE so that the text gets added to the view
        return TRUE;
    }
  17. 4

    Código Swift

    Implementar UITextViewDelegate en su clase /Vista así:

    class MyClass: UITextViewDelegate  { ...

    establecer el textView delegado de auto

    myTextView.delegate = self

    Y, a continuación, aplicar el siguiente:

      func textViewDidChange(_ textView: UITextView) {
        if textView.text.characters.count >= 1 {
    
            if let lastChar = textView.text.characters.last {
    
                if(lastChar == "\n"){
    
                  textView.text = textView.text.substring(to: textView.text.index(before: textView.text.endIndex))
                  textView.resignFirstResponder()
                }
            }
        }
    }

    EDITAR
    He actualizado el código, porque nunca es una buena idea para cambiar la entrada de usuario en un campo de texto para un workarround y no restablecer el estado después de que el hack código completado.

  18. 3

    También puede ocultar el teclado cuando toque en la pantalla de visualización:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
         UITouch * touch = [touches anyObject];
         if(touch.phase == UITouchPhaseBegan) {
            [txtDetail resignFirstResponder];
          }
     }
    • En mi humilde opinión, este es un muy buen enfoque, mucho mejor que con el botón que está cubriendo todo punto de vista.
  19. 3

    Respuesta rápida:

    override func viewDidLoad() {
        super.viewDidLoad()
        let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
        view.addGestureRecognizer(tapGestureReconizer)
    }
    
    func tap(sender: UITapGestureRecognizer) {
        view.endEditing(true)
    }
  20. 3

    He utilizado este código para cambiar respondedor.

     - (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
        {
            if ([text isEqualToString:@"\n"]) {
                //[textView resignFirstResponder];
                //return YES;
                NSInteger nextTag = textView.tag + 1;
                //Try to find next responder
                UIResponder* nextResponder = [self.view viewWithTag:nextTag];
                if (nextResponder) {
                    //Found next responder, so set it.
                    [nextResponder becomeFirstResponder];
                } else {
                    //Not found, so remove keyboard.
                    [textView resignFirstResponder];
                }
                return NO; 
    
    
                return NO;
            }
            return YES;
    
        }
    • ¿por qué no utilizar [auto.ver endEditing:YES]; una vez??
  21. 3

    Aceptar. Todo el mundo ha dado respuestas con trucos, pero creo que la mejor manera de lograr esto es mediante

    Conexión de la siguiente acción a la «Hizo Final En la Salida«, evento en Interface Builder.
    (haga clic en el TextField y cntrl-arrastre de ‘Hizo final en la salida‘ con el siguiente método.

    -(IBAction)hideTheKeyboard:(id)sender
    {
        [self.view endEditing:TRUE];
    }
    • -1 La pregunta es acerca de UITextView y no UITextField mi amigo
    • la mayoría de estas respuestas están aquí con votos porque se adapta a diferentes escenarios de diferentes desarrolladores.
    • Si usted está usando un UITextField, esta es la forma de hacerlo. Por CIERTO, usted debe utilizar SÍ/NO para Objective-C BOOLs, no de VERDADERO/FALSO.
    • VERDADERO/FALSO, también es correcto
  22. 1
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text
    {
        if (range.length==0) {
            if ([text isEqualToString:@"\n"]) {
                [txtView resignFirstResponder];
                if(textView.returnKeyType== UIReturnKeyGo){
    
                    [self PreviewLatter];
                    return NO;
                }
                return NO;
            }
        }   return YES;
    }
  23. 1
    + (void)addDoneButtonToControl:(id)txtFieldOrTextView
    {
        if([txtFieldOrTextView isKindOfClass:[UITextField class]])
        {
            txtFieldOrTextView = (UITextField *)txtFieldOrTextView;
        }
        else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
        {
            txtFieldOrTextView = (UITextView *)txtFieldOrTextView;
        }
    
        UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,
                                                                              0,
                                                                              [Global returnDeviceWidth],
                                                                              50)];
        numberToolbar.barStyle = UIBarStyleDefault;
    
    
        UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_return"]
                                                                    style:UIBarButtonItemStyleBordered
                                                                   target:txtFieldOrTextView
                                                                   action:@selector(resignFirstResponder)];
    
        numberToolbar.items = [NSArray arrayWithObjects:btnDone,nil];
        [numberToolbar sizeToFit];
    
        if([txtFieldOrTextView isKindOfClass:[UITextField class]])
        {
             ((UITextField *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
        }
        else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
        {
             ((UITextView *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
        }
    }
  24. 1

    La pregunta es cómo hacerlo con la tecla de retorno, pero creo que esto podría ayudar a alguien con la intención de hacer de teclado desaparecen cuando se utiliza UITextView:

    @IBOutlet weak var textView: UITextView!
    
    private func addToolBarForTextView() {
      let textViewToolbar: UIToolbar = UIToolbar()
      textViewToolbar = UIBarStyle.Default
      textViewToolbar = [
        UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.cancelInput)),
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.doneInput))
      ]
      textViewToolbar()
      self.textView.inputAccessoryView = textViewToolbar //do it for every relevant textView if there are more than one
    }
    
    func doneInput() {
      self.textView.resignFirstResponder()
    }
    
    func cancelInput() {
      self.textView.text = ""
      self.textView.resignFirstResponder()
    }

    Llamada addToolBarForTextView() en el viewDidLoad o algún otro método de ciclo de vida.

    Parece que era la solución perfecta para mí.

    Saludos,

    Murat

  25. 0

    Sé que no es la respuesta exacta a esta pregunta, pero me he encontrado con este hilo después de la caza de la internet por una respuesta. Supongo que otros comparten ese sentimiento.

    Este es mi variación de la UITapGestureRecognizer que me parece fiable y fácil de usar – sólo tienes que configurar el delegado de la TextView para el ViewController.

    Lugar de ViewDidLoad puedo añadir el UITapGestureRecognizer cuando el TextView se activa para su edición:

    -(void)textViewDidBeginEditing:(UITextView *)textView{
        _tapRec = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
    
        [self.view addGestureRecognizer: _tapRec];
        NSLog(@"TextView Did begin");
    }

    Cuando me toque fuera del TextView, la vista se termina el modo de edición y el UITapGestureRecognizer propio quita para que yo pueda seguir interactuando con otros controles en la vista.

    -(void)tap:(UITapGestureRecognizer *)tapRec{
        [[self view] endEditing: YES];
        [self.view removeGestureRecognizer:tapRec];
        NSLog(@"Tap recognized, tapRec getting removed");
    }

    Espero que esto ayude. Parece tan obvio, pero nunca he visto esta solución en cualquier lugar en la web, la estoy haciendo algo mal?

  26. 0

    Probar esta .

    NSInteger lengthOfText = [[textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length];
  27. 0

    Para Xcode 6.4., Swift 1.2. :

       override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
        {
            super.touchesBegan(touches, withEvent: event)
            if let touch = touches.first as? UITouch
            {
                self.meaningTextview.resignFirstResponder()
            }
        }
    • a veces no funciona
  28. -1
    -(BOOL)textFieldShouldReturn:(UITextField *)textField; //called from textfield (keyboard)
    
    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; //good tester function - thanks
  29. -1

    Mi hack para este :

    1 – crear un botón que cubre la totalidad de la vista;
    2 – enviar al fondo de su vista,
    3 – cambiar el Tipo de Ronda «Rect» a «Personalizado» en el Atributo Inspector,
    4 – crear una acción
    5 – aplicar el método de acción:

    - (IBAction)bgTouched:(id)sender 
    {
        //to dismiss keyboard on bg btn pressed
        [_userInput resignFirstResponder];
    }

    donde _userInput es su TextField salida

  30. -1

    función hideQueboard.

    - (void)HideQueyboard
    {
        [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder)   to:nil from:nil forEvent:nil];
    }
    • Teniendo en cuenta la forma en que usted está hablando a nosotros, que es realmente una terrible respuesta.
    • Lo siento por mi comportamiento.
    • este Proceso es demasiado largo
    • Lo siento, pero yo trabajo mucho. Tengo un profundo respeto por los Desarrolladores. Disculpe. Yo soy el primero en ayudar a otros desarrolladores.
  31. -1

    Para Swift 3, este código me permitió pulsar fuera de la UITextView para despedir el teclado.

    @IBOutlet weak var comment: UITextView!
    
       override func viewDidLoad() {
            super.viewDidLoad()
    
            comment.delegate = self
    
            let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(tap))
            view.addGestureRecognizer(tapGestureRecogniser)
        }
    
        func tap(sender: UITapGestureRecognizer) {
            if comment.isFirstResponder {
                comment.resignFirstResponder()
            }
        }
  32. -1

    Debe agregar UIToolbar a la parte superior UITextView para hacer fácil en lugar de utilizar shouldChangeTextIn

    En Swift 4

    let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
            toolbar.barStyle = .default
            toolbar.items = [
                UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
                UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneAction))
            ]
            textView.inputAccessoryView = toolbar
    @objc func doneAction(){
     self.textView.resignFirstResponder()
    }

Dejar respuesta

Please enter your comment!
Please enter your name here