2016-03-29 19 views
1

kullanırken klavye, kullanıcının girişini almak için bir metin kutusuna sahip bir UIAlertController kullanan bir yan proje uygulamasına sahibim. Sorunum, kullanıcı bir metin girdiğinde ve 'Ekle' düğmesine bastığında, Klavye kapanmadan önce 1-3 saniye boyunca açık kalır. Ancak, kullanıcı klavyedeki metin kutusuna girilen metinle dönüş tuşuna basarsa, bu gerçekleşmez. Başlangıçta tamamlama işleyicileri kullanmaktan ve tamamlamak için beklemek zorunda kaldığını düşündüm, ama geri dönüş anahtarı iyi çalıştığından bu durumun böyle olduğunu düşünmüyorum.UIAlertController

ben uyarı gösterecek budur:

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

Ve bu işlevi arıyorum nasıl: Ben çünkü aslında o onun muhtemel bir bahis almak zorunda Yani

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

cevap

2

Daha önce bu sorunu ele aldım. Ne yazık ki, bütün araştırmalarımda, sahip olduğunuzla aynı sonuçlara vardım. Uyarı üzerine bir tuşa basıldığında artık yerleşik bir gecikme var. Değiştirdiğiniz veya başka bir iş parçacığında çalıştırdığınız veya çalıştırdığınız kod bu gecikmeyi engelleyemez. Diğerleri de bunun Apple tarafından oluşturulan işlev olduğunu doğruladı.

+0

Vay bu çok sinir bozucu ... Bunun neden uygulanacağını hayal edemiyorum. Bunun etrafında bir yolu var mı? Girilen metni YALNIZCA klavye dönüş düğmesini kullanarak geri alabilir miyim? Bunu yapmak için bir yol bulamadım – dsch

+0

Kendimi küçük gecikme için kendime istifa ettim, (1) pek çok kişi sadece klavye bitti düğmesini kullanabilir ve (2) kullanıcılar muhtemelen bundan rahatsız olmaz. Bir klavye düğmesine basarak bir kullanıcıyı simüle etmek karanlık yoluna gitmek istiyorsanız, ejderhalar var. – sschale

+0

Bu doğru. Klavyeden yapılmış düğmeyi hemen hemen her zaman mevcutsa kullanırım. Sadece bunun mevcut olduğunu ve bir kullanıcının düğmeyi gerçekten kullanması durumunda, bununla uğraşması gerekiyor. Bilgi için teşekkürler! – dsch

0

Tüm bunlar ana iş parçacığı üzerinde gerçekleşiyor, bu da eğer bir şey girmeden geri dönüşü vurduğunuzda sorun oluşmazsa anlam ifade ediyor. Uygulamanızın olabildiğince hızlı yanıt vermesini istiyorsunuz, böylece kullanıcı etkileşimli ve kullanıcı arayüzü tabanlı her şey ana iş parçacığı üzerinde olur. Muhtemelen yapmak istediğiniz, metni eşzamansız olarak kaydetmektir, yani girilen metin ile yapacağınız herhangi bir veri tasarrufu, alertView öğesinin reddedilmesiyle ilgili olmayan başka bir iş parçasında gerçekleşecektir. bu mantıklı mı?

+0

Teşekkürler. Evet, mantıklı geliyor, ama şey, girilen metin ile dönüş tuşuna basarsam, her şey iyi çalışıyor. Örneğin: Metin ekledim, 'Ekle'ye basın, geciktirir. Sonra metin ekleyip 'return' tuşuna basıyorum, gecikmiyor. Yorumunuz hala mantıklı mı? Belki de uyarı ile etkileşimde sorun mu var? – dsch

İlgili konular