ios iphone ios7 ios8 ios8.1

BecomeFirstResponder no funciona en iOS 8



iphone ios7 (8)

A veces ayuda renunciar primero al primer respondedor:

var tapGesture = UITapGestureRecognizer() tapGesture.rac_gestureSignal().subscribeNext { [weak self] (_) -> Void in self?.inputTextField.resignFirstResponder() self?.inputTextField.becomeFirstResponder() } self.charViewsContainer.addGestureRecognizer(tapGesture)

Estoy usando el método de UITextField BecomeFirstResponder para mostrar el teclado. Esto funciona en iOS 7. Pero en iOS 8 este método no muestra el teclado.

UITextField *txtAddNew = [[UITextField alloc] initWithFrame:CGRectMake(10,10,240, 21)]; txtAddNew.font = [UIFont fontWithName:@"Helvetica" size:16]; txtAddNew.clearButtonMode = UITextFieldViewModeWhileEditing; txtAddNew.returnKeyType = UIReturnKeyDone; txtAddNew.delegate = self; txtAddNew.autocorrectionType = UITextAutocorrectionTypeNo; txtAddNew.tag = 15; // Open keyboard [txtAddNew becomeFirstResponder];

¿Hay alguna forma de hacerlo en iOS 8?


Añade esta línea en tu código. Espero que funcione

[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];


Creo que te perdiste el addsubview el txtAddNew a la Mainview

txtAddNew.tag = 15; [self.view addsubview:txtAddNew]; // Open keyboard [txtAddNew becomeFirstResponder];


En caso de que otros tengan el mismo problema que yo:

Tenía un IBOutlet conectado a mi UITextField . De forma errónea, estaba inicializando esto en mi método viewDidLoad . Es decir, [[textField alloc] init]; . Saqué esto y todo volvió a funcionar.


Intenta llamar a BecomeFirstResponder como a continuación

[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];

Según Apple,

Un objeto respondedor solo se convierte en el primer respondedor si el respondedor actual puede renunciar al estado del primer respondedor (canResignFirstResponder) y el nuevo respondedor puede convertirse en el primer respondedor.

Puede llamar a este método para hacer que un objeto respondedor, como una vista, sea el primer respondedor. Sin embargo, solo debe llamarlo en esa vista si es parte de una jerarquía de vistas. Si la propiedad de ventana de la vista contiene un objeto UIWindow, se ha instalado en una jerarquía de vistas; si devuelve cero, la vista se separa de cualquier jerarquía.


Para iOS 9.3, lo siguiente me funcionó:

private var searchTextFieldShouldReturn = false override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.searchTextFieldShouldReturn = false self.searchTextField.becomeFirstResponder() } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) self.searchTextFieldShouldReturn = true self.searchTextField.resignFirstResponder() } func textFieldShouldReturn(textField: UITextField) -> Bool { self.searchTextFieldShouldReturn = true textField.resignFirstResponder() return true } func textFieldShouldEndEditing(textField: UITextField) -> Bool { return self.searchTextFieldShouldReturn }

Por lo tanto, debe asegurarse de que también implementa el delegado textFieldShouldEndEditing.


Swift 4 y iOS 11

En mi caso, no importa lo que intenté, no pude configurar el primer respondedor hasta que probé esto.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if cell.isKind(of: YOURTABLEVIEWCELL.self) { if let yourCell = cell as? YOURTABLEVIEWCELL{ yourCell.yourUiTextField.becomeFirstResponder() } } }

Espero que esto ayude a alguien atrapado con el mismo problema.


Swift 3

Aquí está la versión 3 rápida de la respuesta aceptada. Para que funcionara también tuve que agregar un retraso.

txtAddNew.perform( #selector(becomeFirstResponder), with: nil, afterDelay: 0.1 )