2010-05-13 18 views
48

Esta es probablemente una pregunta tonta, pero no puedo encontrar la respuesta en la documentación. ¿El botón "Hecho" en el teclado emergente siempre causa que el teclado desaparezca? Veo una gran cantidad de código en la web de esta manera:teclado del iPhone, botón Listo y resignFirstResponder

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    [theTextField resignFirstResponder]; 
    return YES; 
} 

Al pulsar el botón "Done", cuando aparezca el teclado hacia abajo y el UITextField dimite primer nivel de respuesta.

estoy presumiendo que al pulsar el botón "Done" no se usa para hacer UITextField a resignFirstResponder, pero que el comportamiento cambiado en algún momento.

estoy depuración en OS 3.0 - 3.1.3

+1

Ver https://developer.apple.com/library/ios/#documentation/iphone/conceptual/iPhone101/Articles/05_ConfiguringView.html –

+1

Al parecer, I don' Tengo suficiente representante para agregar un comentario a la respuesta de Nevan King, por lo que mencionaré aquí que para su solución no es necesario convertir la clase en UITextFieldDelegate. El protocolo UITextFieldDelegate solo define algunos mensajes enviados al delegado preguntando si el campo de texto debe renunciar, si lo hizo, etc. ... Cualquier objeto puede recibir acciones en la forma en que su respuesta se ha implementado simplemente definiendo su método en la forma en que lo hizo con textFieldFinished. –

Respuesta

89

I hizo un pequeño proyecto de prueba con sólo un UITextField y este código

#import <UIKit/UIKit.h> 
@interface TextFieldTestViewController : UIViewController 
<UITextFieldDelegate> 
{ 
    UITextField *textField; 
} 
@property (nonatomic, retain) IBOutlet UITextField *textField; 
@end 

#import "TextFieldTestViewController.h" 
@implementation TextFieldTestViewController 
@synthesize textField; 

- (void)viewDidLoad 
{ 
    [self.textField setDelegate:self]; 
    [self.textField setReturnKeyType:UIReturnKeyDone]; 
    [self.textField addTarget:self 
        action:@selector(textFieldFinished:) 
     forControlEvents:UIControlEventEditingDidEndOnExit]; 
    [super viewDidLoad]; 
} 
- (IBAction)textFieldFinished:(id)sender 
{ 
    // [sender resignFirstResponder]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

El campo de texto es un no modificada UITextField arrastrado sobre la SEMILLA, con la salida conectada.
Después de cargar la aplicación, al hacer clic en el campo de texto hace aparecer el teclado. Al presionar el botón "Listo", el campo de texto pierde el foco y anima el teclado. Tenga en cuenta que el consejo en la web es usar siempre [sender resignFirstResponder], pero esto funciona sin él.

+0

Hmm. Y qué es addTarget: action: forControlEvents: for? No es setDelegate: ¿es suficiente? Déjame probarlo solo. – bealex

+0

Sí, exactamente. Si eliminas addTarget: ... llamar, todo va bien. – bealex

+1

Para noobs como yo, la forma de hacerlo con el constructor de interfaz es arrastrar el + desde "Did End On Exit" al propietario del archivo y luego asignarlo a un IBAction que no hace nada (textFieldFinished: (id) remitente en este ejemplo). La respuesta anterior es correcta, solo quería agregarle. –

6

De la documentación (cualquier versión):

Es la responsabilidad de su aplicación para ocultar el teclado en el momento de su elección . Usted puede ocultar el teclado en respuesta a una acción del usuario específico, como el usuario tocando un botón en particular en su interfaz de usuario. También puede configurar su delegado campo de texto para ocultar el teclado cuando el usuario presiona la tecla “retorno” en el teclado sí. Para ocultar el teclado , enviar el mensaje resignFirstResponder al campo texto que es actualmente el primer respondedor. Si lo hace, el objeto de campo de texto para terminar la sesión de edición actual (con el consentimiento del objeto delegado ) y ocultar el teclado .

Por lo tanto, debe enviar resignFirstResponder de alguna manera. Pero existe la posibilidad de que las pérdidas de campos de texto se enfoquen de otra manera durante el procesamiento de textFieldShouldReturn: message. Esto también hará que el teclado desaparezca.

+0

Gracias por la respuesta. Encontré la parte que está causando que 'UITextField' renuncie a la primera respuesta. Tengo una llamada '\t [textField addTarget: self action: @selector (textFieldDone :) forControlEvents: UIControlEventEditingDidEndOnExit]'. Curiosamente, el método 'textFieldDone:' está vacío (he eliminado la llamada 'resignFirstResponder'). Así que todavía no puedo entender por qué el teclado desaparece. –

+0

¿Quizás mueva el foco a otro componente implícitamente? ¿Cambiando algún valor en una tabla o una etiqueta, por ejemplo? – bealex

+0

No creo que haya nada más en juego. Creé un proyecto pequeño (publicado el código a continuación) y muestra el mismo comportamiento. No estoy seguro de por qué está sucediendo. –

2

Una línea de código para el botón Hecho: -

[yourTextField setReturnKeyType:UIReturnKeyDone]; 

Y añada método de acción en valueChanged del campo de texto y añadir esta línea-

[yourTextField resignFirstResponder]; 
13

En Xcode 5.1

Habilitar botón Listo

  • En Atributos inspector para la UITextField en Storyboard encontrar el campo "Clave de retorno" y seleccione "Hecho"

Ocultar teclado cuando se hace se presiona

  • En Storyboard, haga que su ViewController sea el delegado para el UITextField
  • Añadir este método para su ViewController

    -(BOOL)textFieldShouldReturn:(UITextField *)textField 
    { 
        [textField resignFirstResponder]; 
        return YES; 
    } 
    
Cuestiones relacionadas