1

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

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

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

上面的行给出了错误(不能在属性初始化器中使用实例成员“数据”;属性初始化器在 self 可用之前运行。

#2:在警报中添加这个“发布”按钮并使其禁用

alert.addAction(saveAction)
saveAction.isEnabled = false

#3 添加两个函数来检测textfield和textview中有多少单词,如果符合要求,启用“发布”按钮

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
    }
}

理想的情况是,当满足要求,用户点击“发布”按钮时,我将获取数据[“名称”]和数据[“内容”]并将其插入数据库。现在我已经让它工作到在满足要求后启用“发布”按钮,但是当尝试获取数据时它给出错误“不能在属性初始化器中使用实例成员'数据';属性初始化器在 self 可用之前运行。

你能建议如何解决这个问题吗?谢谢你。

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

1

所以这就是我要做的

在 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 后不会出现保留周期。

于 2021-03-18T06:01:40.067 回答