Swift: 如何正确编写带有文本字段和文本视图验证的 UIAlertAction?

Swift: How to properly write UIAlertAction with textfield and textview validation?

我正在创建一个应用程序,其中一个选项卡是用户可以在其中写东西的留言簿。我使用 UIAlertController 弹出一个 window,其中包含用于输入名称的文本字段和用于输入消息的文本视图。我想默认禁用“Post”按钮,然后在名称字段至少有 2 个字符且消息至少有 3 个字符后启用它。我通过

实现了这一点

#1: 在顶部声明“Post”UIAlertAction

let saveAction = UIAlertAction(title:"Post", style: .default, handler: { (action) -> Void in print(data) })

上面一行给出了错误 (Cannot use instance member 'data' within 属性 initializer; 属性 initializers 运行 before self is available. )

#2:在警报中添加此“Post”按钮并将其禁用

alert.addAction(saveAction)
saveAction.isEnabled = false

#3 添加两个函数检测textfield和textview中有多少个单词,如果满足要求,启用“Post”按钮

func textViewDidChange(_ textView: UITextView) { //Handle the text changes here
    GuestbookContentWordCount = textView.text.count
    data["content"] = textView.text
    enableSave()
    }
@objc func textFieldDidChange(_ textField: UITextField) {
    GuestbookNameWordCount = textField.text?.count ?? 0
    data["name"] = textField.text
    enableSave()
}
func enableSave () {
    if GuestbookContentWordCount >= 3 && addGuestbookNameWordCount >= 2 {
        saveAction.isEnabled = true
    } else {
        saveAction.isEnabled = false
    }
}

理想情况是当满足要求,用户点击“Post”按钮时,我会得到data[“name”]和data[“content”],插入到一个数据库。现在我已经让它工作到满足要求后启用“Post”按钮的程度,但是在尝试获取数据时它给出错误“无法使用实例成员'data'在 属性 个初始值设定项内;属性 个初始值设定项 运行 之前 self 可用。

请问如何解决这个问题?谢谢。

这就是我要做的

在 viewDidLoad() 之外更改您对 UIAlertAction 的引用

var saveAction: UIAlertAction? = nil

在 viewDidLoad() 中,您可以像这样实例化它:

saveAction = UIAlertAction(title:"Post", style: .default, handler: { [weak self] (action) -> Void in
    guard let `self` = self else { return }
    print(self.data) }
)

[weak self] 的使用是为了避免在 UIViewController 被取消初始化后出现保留循环。