如何将 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?