有没有办法获取 UIAlertAction 中的文本字段值?

Is there way to get the text field value in UIAlertAction?

我正在尝试重构 Swift 中的 UIAlert,我想确定是否有一种方法可以实现代码来实现我现在想要做的事情。

在我的应用程序中,我需要显示几个 UIAlertController,并且为了使文件变小,我制作了一个自定义函数来显示 AlertController 并根据用户操作采用触发方法(我的意思是...按下取消时, 关闭弹出窗口 e.t.c.).

我正在处理的是有一个 TextField,我想要实现的是当用户点击“确定”操作按钮时,获取 TextField 的值。

在我的 UIVC+Alert.swift 文件中,我创建了一个扩展并添加了函数,“showAlertWithTextField”,如下所示。

import UIKit

extension UIViewController {
    
    func showAlertWithTextField(title: String?, message: String?, actions: [UIAlertAction], style: UIAlertController.Style, completion: (() -> Void)?) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: style)
        alert.addTextField { (textField) in
            print("textField \(textField.text)")
        }
        actions.forEach { alert.addAction([=10=])}
        present(alert, animated: true, completion: completion)
    }
}

然后,这个。从其他 swift 文件 ViewController.swift.

调用函数
func showAlert() {
    let editAction = UIAlertAction(title: "Edit", style: .destructive) { _ in

        // want to get the value of textFields in here...
        if let title = <How to access the textfield value ??> {
                print("title: \(title)")
        }
     }
     self.showAlertWithTextField(title: "test", message: nil, actions: [editAction], style: .alert, completion: nil)

}

通常,我不制作扩展文件,我将所有内容都写在同一个文件中,因此我可以使用 alert.textFields![0].text 之类的东西访问该值。但在这种情况下,当我在 showAlertWithTextField 函数中使用 alert.addTextField 时,用户没有输入任何内容并得到空字符串(这是有道理的)。但是,当用户点击“编辑”按钮(触发 editAction 按钮)时,有没有办法访问警报的文本字段?

您可以获得顶级视图控制器,它将安全地解包到警报控制器

let editAction = UIAlertAction(title: "Edit", style: .destructive) { _ in

          let keyWindow = UIApplication.shared.windows.filter {[=10=].isKeyWindow}.first
 
          if var topController = keyWindow?.rootViewController {
            while let presentedViewController = topController.presentedViewController as? UIAlertController {
        topController = presentedViewController
              }

// topController should now be your topmost view controller

 if let title = topController.textFields?[0].text{
                print("title: \(title)")
        }
   }
       
}

一个swifty方法是为文本字段添加一个临时变量和一个处理程序来将警报的文本字段分配给变量

func showAlert() {
    weak var textField : UITextField?

    let editAction = UIAlertAction(title: "Edit", style: .destructive) { _ in
        print("Edit Pressed", textField?.text ?? "n/a")
    }
    let handler : (UITextField) -> Void = { textField = [=10=] }
    self.showAlertWithTextField(title: "test", message: nil, actions: [editAction], style: .alert, handler: handler, completion: nil)

}

在扩展程序中,在添加文本字段后立即调用处理程序

extension UIViewController {
    
    func showAlertWithTextField(title: String?, message: String?,
                                actions: [UIAlertAction],
                                style: UIAlertController.Style,
                                handler: ((UITextField) -> Void)? = nil,
                                completion: (() -> Void)?) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: style)
        alert.addTextField { handler?([=11=]) }
        actions.forEach { alert.addAction([=11=])}
        present(alert, animated: true, completion: nil)
    }
}