func savingIsAllowed(with name: String) -> Bool{
return name.characters.count > 0 && !IncomeExpense.shared.categories.contains { $0.name == name }
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let name = textField.text ?? ""
alertController.actions[0].isEnabled = savingIsAllowed(with: name)
return true
}
在此screenshot中是一个UIalertcontroller,当使用其委托为tableviewcontroller的文本字段点击添加按钮时出现。我想在文本字段中的字符串已经在列表中或者为空时立即禁用其保存按钮。使用此代码,可以防止空字符串,但不会重复。 TextFieldEditingDidBegin和DidEnd表现相似。只有退格时才会禁用保存按钮。怎么了?
答案 0 :(得分:0)
您正在实施shouldChangeCharacters
,而您似乎不明白它的作用。在那一刻,角色尚未更改。例如,如果用户键入" Jo"然后" b",在shouldChangeCharacters
之前得到textField.text
"工作" (因为shouldChangeCharacters
正好问你是否输入" b")。因此,查看textField.text
的测试无法正常工作。
还有另一个原因导致您的测试失败:正如rmaddy所指出的那样,您正在验证范围(savingIsAllowed(with: string)
)的替换字符串,而不是整个文本。 [编辑好的,现在你正在以更快的方式更改代码而不是我可以输入。但是,我不会玩这个游戏。]
你想要做的是完全重新开始。为文本字段editingChanged
事件实施控制事件,并回复 。