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

Posted

技术标签:

【中文标题】有没有办法在 UIAlertAction 中获取文本字段值?【英文标题】:Is there way to get the text field value in UIAlertAction? 【发布时间】:2021-07-26 07:46:37 【问题描述】:

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

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

我正在研究的是有一个 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($0)
        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按钮)时,有没有办法访问警报的文本字段?

【问题讨论】:

【参考方案1】:

一种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 = $0 
    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?($0) 
        actions.forEach  alert.addAction($0)
        present(alert, animated: true, completion: nil)
    

【讨论】:

非常感谢您的回复。上面的代码工作正常,我能够实现我想做的事情。我知道我需要创建一个临时变量,但不确定为什么同时编写 textField = $0handler?($0) 可以访问 showAlert 函数中的 textField.text 值?非常感谢您的帮助,Vadian,希望我能向您学习! addTextField 行传递闭包中的文本字段实例,handler?($0) 将该实例移交给 handler,后者将其分配给临时变量。语法alert.addTextField handler?($0) alert.addTextField textfield in handler?(textfield) 的缩写形式【参考方案2】:

您可以获得***视图控制器,该控制器将安全地展开到警报控制器

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

          let keyWindow = UIApplication.shared.windows.filter $0.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)")
        
   
       

【讨论】:

以上是关于有没有办法在 UIAlertAction 中获取文本字段值?的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertAction 值列表

SwiftUI:UIAlertController 的 textField 在 UIAlertAction 中没有响应

注册通知时如何从存在的 UIAlertcontroller 获取 UIAlertAction

这个 UIAlertAction 代码有啥问题?不允许点击/点击并在应用程序中前进

UIAlertAction改变颜色[重复]

UIAlertAction 按钮文本左对齐