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 被取消初始化后出现保留循环。
我正在创建一个应用程序,其中一个选项卡是用户可以在其中写东西的留言簿。我使用 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 被取消初始化后出现保留循环。