2016-03-29 2 views
1

J'ai une application de projet parallèle qui utilise un UIAlertController avec une zone de texte pour obtenir des informations de l'utilisateur. Mon problème est, quand un utilisateur entre le texte et appuie sur «Ajouter», le clavier reste ouvert pendant 1-3 bonnes secondes avant de le renvoyer. Toutefois, si l'utilisateur appuie sur la touche de retour avec le texte entré dans la zone de texte sur le clavier, cela ne se produit pas. Au départ, je pensais que c'était en utilisant les gestionnaires de complétion et en attendant que cela se termine, mais puisque l'utilisation de la touche de retour fonctionne bien, je ne pense pas que ce soit le cas.Laps de clavier lors de l'utilisation de UIAlertController

C'est là que j'affiche l'alerte:

func addItem(view: UIViewController, completion: (text: String?) -> Void) { 

    let diag = UIAlertController(title: "Add Task", message: "Enter a task name", preferredStyle: .Alert) 
    diag.addTextFieldWithConfigurationHandler({ (textField) -> Void in }) 

    diag.addAction(UIAlertAction(title: "Add", style: .Default, handler: { (action) -> Void in 
     let textOfTask = diag.textFields![0] as UITextField 
     let textValue = textOfTask.text! 

     if textValue.characters.count > 0 { 
      completion(text: textValue) 
     } 
    })) 
    diag.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction!) in 
    completion(text: nil) 
    })) 
    view.presentViewController(diag, animated: true, completion: nil) 
} 

Et comment je fais appel de cette fonction est:

@IBAction func didPressAdd(sender: AnyObject) { 
    addItem(self) { 
     (text) in 
     if let itemText = text { 
      // Check if has all the datas 
      if (self.def.objectForKey("simplest_itemlist") != nil) { 
       // Does have all the datas 
       self.tableView.reloadData() 
      } 

      // Append new data 
      self.itemList.append(itemText) 
      self.tableView.reloadData() 

      // Save to UserDefaults 
      self.def.setObject(self.itemList, forKey: "simplest_itemlist") 
      self.def.synchronize() 

      print(self.itemList) 
     } 
    } 
} 

Répondre

2

J'ai déjà traité ce problème. Malheureusement, dans toutes mes enquêtes, j'en suis arrivé aux mêmes conclusions que vous. Il y a maintenant un délai intégré lorsqu'un bouton est appuyé sur l'alerte. Aucun code que vous modifiez ou n'exécutez pas ou exécutez sur un autre thread empêchera ce retard. D'autres ont également confirmé que c'est la fonctionnalité construite par Apple.

+0

Wow c'est très frustrant .. Je ne peux pas imaginer pourquoi cela serait mis en œuvre. Y a-t-il un moyen de contourner ceci? Puis-je d'une manière ou d'une autre retourner le texte saisi en utilisant SEULEMENT le bouton de retour du clavier? Je n'ai pas trouvé un moyen de faire cela – dsch

+0

Je me suis résigné au petit retard, en reconnaissant que (1) beaucoup de gens peuvent simplement utiliser le bouton du clavier fait et (2) les utilisateurs ne seront probablement pas dérangés par cela. Si vous voulez descendre la route sombre de la simulation d'un utilisateur en appuyant sur un bouton du clavier, il y a des dragons. – sschale

+0

C'est vrai. J'utilise le bouton du clavier presque toujours s'il est disponible. Cela me gêne simplement que cela existe et si un utilisateur utilise réellement le bouton, il doit s'en occuper. Merci néanmoins pour l'info! – dsch

0

Donc, si je devais prendre un pari est probable en raison du fait que Tout cela se passe sur le fil principal, ce qui est logique si le problème ne se produit pas lorsque vous appuyez sur Entrée sans entrer quoi que ce soit. Vous voulez que votre application soit la plus réactive possible arriver sur le fil principal. Ce que vous voulez probablement faire est de sauvegarder le texte de façon asynchrone, ce qui signifie que toute sauvegarde de données que vous ferez avec le texte saisi se fera sur un autre thread qui ne traite pas de rejeter alertView. Cela a-t-il du sens?

+0

Merci. Cela a du sens oui, mais la chose est, si j'appuie sur la touche de retour avec le texte entré, tout fonctionne bien. Par exemple: J'ajoute du texte, j'appuie sur 'Ajouter', il est en retard. Ensuite, j'ajoute du texte et j'appuie sur 'return', ça ne traîne pas. Votre commentaire a-t-il encore un sens? Peut-être que l'interaction avec l'alerte est le problème? – dsch