Проблемы с получением текста с использованием TextField из UIAlertController в Swift - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь получить метку для сохранения изображения, используя TextField UIAlertController в Xcode 10.3. Код следующий:

    {
      ...
   saveLabel = saveImage(imagePath: imagePath, image: image)
   print(saveLabel)
      ...
    }


 func saveImage(imagePath: String, image: UIImage) -> String {

    var label = "placeholder"
    let data = image.jpegData(compressionQuality: 0.5)
    if fileManager.createFile(atPath: imagePath as String, contents: data, attributes: nil) {
        let myAlert = UIAlertController(title: "Saved", message: "Label photo", preferredStyle: .alert)
        myAlert.addTextField { (textField) in textField.placeholder = "Enter Label" }
        let labelAction = UIAlertAction(title: "Enter", style: .default, handler: { (_) in
            label = myAlert.textFields?[0].text ?? "Saved" })
        myAlert.addAction(labelAction)
        self.present(myAlert, animated: true, completion: nil)
        return label
    } else {
        print("failed to save")
    }

    return "not right label"
}

Кажется, все работает, например, изображение было сохранено, за исключением того, что label = "placeholder" был возвращен и напечатан. Текст, который я ввел в диалоговое окно, никогда не возвращался. Используя отладку для пошагового выполнения кода, я обнаружил, что диалоговое окно действительно появилось после того, как функция вернулась и команда была выполнена. Кто-нибудь знает, что я сделал не так? Спасибо.

1 Ответ

0 голосов
/ 23 февраля 2020

обошел проблему, принудительно введя код, который использовал пользовательский ввод в обработчик, например print (saveLabel), следующим образом:

    {
      ...
    savedSuccess = saveImage(imagePath: imagePath, image: image)

      ...
    }

  func saveImage(imagePath: String, image: UIImage) -> Bool {
    var label = ""
    let data = image.jpegData(compressionQuality: 0.5)
    if fileManager.createFile(atPath: imagePath as String, contents: data, attributes: nil) {
        let myAlert = UIAlertController(title: "Saved", message: "Label photo", preferredStyle: .alert)
        myAlert.addTextField { (textField) in textField.placeholder = "Enter Label" }
        let labelAction = UIAlertAction(title: "Enter", style: .default, handler: { (_) in
            label = myAlert.textFields?[0].text ?? "" 
         if label !="" {
              ....
            print(label)
              ....
            })

    myAlert.addAction(labelAction)
    self.present(myAlert, animated: true, completion: nil)
    return True
} else {
    print("failed to save")
    return False
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...