2016-03-29 15 views
1

私は、ユーザーからの入力を得るためにテキストボックスでUIAlertControllerを使用するサイドプロジェクトアプリを持っています。私の問題は、ユーザーがテキストを入力して「追加」を押すと、キーボードが1〜3秒間開いたままになっていることです。ただし、ユーザーがキーボードのテキストボックスに入力したテキストでリターンキーを押すと、これは発生しません。もともと私はそれが完了ハンドラを使用し、それが完了するのを待つ必要があると思ったが、リターンキーを使用するとうまく動作するので、そうは思わない。UIAlertControllerを使用するとキーボードが遅くなります

私は警告を表示する場所です:

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

そして、どのように私はこの関数をされて呼び出しています:

だから、
@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) 
     } 
    } 
} 

答えて

2

私は以前この問題に取り組んできました。残念なことに、私のすべての調査で私はあなたと同じ結論に達しました。アラートにボタンが押されたときに、遅延が組み込まれました。変更したり、実行したり、別のスレッドで実行したりするコードは、この遅延を防ぎません。また、これはAppleが構築した機能であることを確認した人もいます。

+0

うわー、それは非常にイライラしています。私はそれがなぜ実装されるのか想像できません。これを回避する方法はありますか?キーボードの戻るボタンを使って入力したテキストを返すことはできますか?私はそれを行う方法を見つけていない – dsch

+0

私は小さな遅延に自分自身を辞任し、(1)多くの人が単にキーボードのボタンを使用するかもしれないことを認識し、(2)ユーザーはおそらくそれによって悩まされません。ユーザーがキーボードのボタンを押すことをシミュレートする暗い道を下りたいなら、ドラゴンがある。 – sschale

+0

それは本当です。キーボード終了ボタンはほとんどの場合、使用可能な場合は使用します。これが存在することを私に知らせ、ユーザーが実際にボタンを使用している場合は、そのボタンを処理する必要があります。しかし、情報をありがとう! – dsch

0

私はそのせいで事実をその可能性の高い賭けを取らなければならなかった場合このすべてがメインスレッドで起こっています。これは、何も入力せずにリターンをヒットしたときに問題が発生しない場合には意味をなさないものです。あなたのアプリはできるだけ敏感になりたいので、ユーザーインタラクションベースとUIベースはすべてメインスレッドで発生します。おそらく、非同期的にテキストを保存することです。つまり、入力されたテキストを使用してデータを保存すると、alertViewを終了しない別のスレッドでデータが保存されます。それは理にかなっていますか?

+0

ありがとうございました。はいはい、意味がありますが、事実は、テキストが入力されたリターンキーを押すと、すべて正常に動作します。 例:テキストを追加し、「追加」を押します。遅くなります。次に、テキストを追加して「戻る」を押しても、遅くはありません。あなたのコメントはまだ理にかなっていますか?アラートとのやりとりが問題なのでしょうか? – dsch

関連する問題