web-dev-qa-db-fra.com

devenirFirstResponder ne fonctionne pas dans iOS 8

J'utilise la méthode de UITextField, devenueFirstResponder, pour afficher le clavier . Ceci fonctionne sous iOS 7. Mais sous iOS 8, cette méthode ne permet pas d'afficher le clavier.

 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];

Est-il possible de le faire dans iOS 8?

17
Tejas Bharambe

Essayez d'appeler devenirFirstResponder comme ci-dessous

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

Selon Apple,

Un objet répondant ne devient le premier répondant que si le courant le répondeur peut annuler le statut de premier répondant (canResignFirstResponder) et le nouveau répondant peut devenir le premier répondant.

Vous pouvez appeler cette méthode pour créer un objet répondant, tel qu'une vue, le premier intervenant. Cependant, vous ne devriez l'appeler sur cette vue que si fait partie d'une hiérarchie de vues. Si la propriété window de la vue contient un Objet UIWindow, il a été installé dans une hiérarchie de vues. si ça renvoie nil, la vue est séparée de toute hiérarchie.

42
thavasidurai

Swift 3

Voici la version Swift 3 de la réponse acceptée. Pour que cela fonctionne, j'ai également dû ajouter un délai.

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

Je pense que vous avez manqué le addsubview le txtAddNew au Mainview

   txtAddNew.tag = 15;
   [self.view addsubview:txtAddNew];  

   // Open keyboard
  [txtAddNew becomeFirstResponder];
3
Anbu.Karthik

Parfois, il est utile de démissionner en premier du premier intervenant:

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

self.charViewsContainer.addGestureRecognizer(tapGesture)
1
Antoine

Pour iOS 9.3, les éléments suivants ont fonctionné pour moi:

 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
        }

Vous devez donc vous assurer que vous implémentez également le délégué textFieldShouldEndEditing.

0
Zoltan Varadi

ajoutez cette ligne dans votre code. j'espère que ça va marcher 

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

Juste au cas où d'autres auraient le même problème que moi:

J'ai eu une IBOutlet connectée à ma UITextField. À tort, j'étais en train d'initialiser ceci dans ma méthode viewDidLoad. C'est-à-dire, [[textField alloc] init];. J'ai enlevé ceci et tout a encore fonctionné. 

0
espitia

Swift 4 et iOS 11

Dans mon cas, peu importe ce que j'ai essayé, je n'ai pas été en mesure de définir le premier répondeur avant d'avoir essayé.

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()
        }
    }
}

J'espère que cela aide quelqu'un qui est coincé avec le même problème.

0
Derek Hierhohlzer