首页 > 解决方案 > 在 Swift 中使用 UIAlertController 的 TextField 获取文本时遇到问题

问题描述

我正在尝试使用 Xcode 10.3 中 UIAlertController 的 TextField 获取用于保存图像的标签。代码如下:

    {
      ...
   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" 被返回和打印。我在对话框中输入的文本从未返回。使用 debug 单步调试代码,我发现对话框实际上是在函数返回并执行打印命令后出现的。有人知道我做错了什么吗?谢谢。

标签: swiftxcode

解决方案


通过强制使用用户输入的代码到处理程序中来解决问题,例如 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
}

}


推荐阅读