如何将 UIAlertController 输出到单独的文件并从那里输出数据?

Posted

技术标签:

【中文标题】如何将 UIAlertController 输出到单独的文件并从那里输出数据?【英文标题】:How can I output UIAlertController to a separate file and output data from there? 【发布时间】:2021-11-05 01:51:30 【问题描述】:

我正在尝试将警报输出到单独的函数,因为会有很多类似的函数。

这是我的提醒:

extension UIViewController 
    func alertEditSum(nameCell: String, completion: (() -> Void)) 
        let alertController = UIAlertController(title: "Hello", message: "", preferredStyle: .alert)
        
        
        alertController.addAction(UIAlertAction(title: "Save", style: .default , handler:  _ in
            let nameFolderField = alertController.textFields![0] as UITextField
            if nameFolderField.isTextFieldCheck(text: nameFolderField.text!) == true 
                
                // -----here----
                
            
        ))
        
        alertController.addAction(UIAlertAction(title: "Cancel"
                                                
                                                , style: .cancel, handler: nil))
        
        alertController.addTextField(configurationHandler:  (nameField: UITextField!) -> Void in
            nameField.clearButtonMode = .always
            nameField.keyboardType = .decimalPad
            
        )
        
        self.present(alertController, animated: true)
        
    
    

而我的一段代码在另一个 VC 中:

self.sortedDate[indexPath.section-1].personPayment = Double(nameFolderField.text!)!
 do 
try! self.context.save()
collectionView.reloadData()

问题是我需要考虑用户在 UITextField 中输入的内容。文本! (nameFolderField.text!)。我也无法在警报代码中添加完成,写入错误。

应将完成添加到它说的行:/ / - - - - - 这里----

请告诉我如何解决这个问题?

【问题讨论】:

究竟是什么错误?还有,isTextFieldCheck(text:)的方法是什么?它是UITextField 的扩展,但它不应该检查自己的文本字段(所以不需要给出文本参数)? 【参考方案1】:

这应该可以解决问题:

func alertEditSum(nameCell: String, completion: @escaping ((String?) -> Void)) 

    let alertController = UIAlertController(title: "Hello", message: "", preferredStyle: .alert)

    alertController.addAction(UIAlertAction(title: "Save", style: .default, handler:  _ in
        let nameFolderField = alertController.textFields![0] as UITextField
        if nameFolderField.isTextFieldCheck(text: nameFolderField.text!) == true 
            completion(nameFolderField.text)
        
    ))

    alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler:  _ in
        completion(nil)
    ))

    alertController.addTextField(configurationHandler:  nameField in
        nameField.clearButtonMode = .always
        nameField.keyboardType = .decimalPad
    )

    self.present(alertController, animated: true)

称呼它:

theViewController.alertEditSum(nameCell: "text")  text in
    if let text = text 
        //Do stuff
     else  //Text is invalid or user has cancel

    

现在,isTextFieldCheck(text:) 我猜是UITextField 上的一个方法,因为它正在检查自己的文本,为什么要把它作为参数? 为什么不只是func isTextValid()

我也会避免强制展开:!

更进一步,将在完成中使用Result<String, Error>completion((Result<String, Error>) -> Void)) 可在需要时获取更多信息(用户已取消,文本因任何原因无效等)

【讨论】:

如果你的意思是 func isTextValid() 通过这个 nameFolderField.isTextFieldCheck(text: nameFolderField.text!我不仅检查了字母,还有许多其他的东西。你的回答很有帮助!一点点解决不了!) 不,我的意思是它可能是func isTextValid() -> Bool guard let text = self.text else return false //do the rest of the check with text 【参考方案2】:

你需要 @escaping 完成来将值从闭包内部发送给调用者,主要更改 completion:@escaping (String?) -> Void)完成(nameFolderField.text)

extension UIViewController 
    func alertEditSum(nameCell: String,completion:@escaping (String?) -> Void) 
        let alertController = UIAlertController(title: "Hello", message: "", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Save", style: .default , handler:  _ in
            let nameFolderField = alertController.textFields!.first!
            if nameFolderField.isTextFieldCheck(text: nameFolderField.text!) 
              completion(nameFolderField.text)
             
        ))
        alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
        alertController.addTextField(configurationHandler:  (nameField: UITextField!) -> Void in
            nameField.clearButtonMode = .always
            nameField.keyboardType = .decimalPad 
        )
        self.present(alertController, animated: true)
    
 

打电话

alertEditSum(nameCell:<#SomeValue#>)  result in
  print(result)

【讨论】:

以上是关于如何将 UIAlertController 输出到单独的文件并从那里输出数据?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在没有用户输入的情况下创建和关闭 UIAlertController? (迅速)

从 UIAlertController 按钮单击导航到 ViewController

如何将accessibilityIdentifier 设置为UIAlertController?

将复选框列表添加到 UIAlertController

如何将 UIActivityIndi​​catorView 放在 UIAlertController 中?

将 ChildViewController 添加到 UIAlertController