【发布时间】:2018-10-17 01:27:54
【问题描述】:
基本上,我们现在得到的是一个按钮,可以根据 TextFields 是否填写来更改其颜色(灰色和绿色)...现在我想添加一个也必须打开的开关让按钮颜色变为绿色,如果不是,则变为灰色。 我究竟如何实现这部分? PS: setupAddTargetIsNotEmptyTextFields() 在 viewDidLoad() 中被调用
func setupAddTargetIsNotEmptyTextFields() {
self.textField_username.addTarget(self, action: #selector(textFieldsIsNotEmpty), for: .editingChanged)
self.textField_eMail.addTarget(self, action: #selector(textFieldsIsNotEmpty),
for: .editingChanged)
self.textField_password.addTarget(self, action: #selector(textFieldsIsNotEmpty), for: .editingChanged)
self.textField_confirmPassword.addTarget(self, action: #selector(textFieldsIsNotEmpty),
for: .editingChanged)
}
@objc func textFieldsIsNotEmpty(sender: UITextField) {
sender.text = sender.text?.trimmingCharacters(in: .whitespaces)
guard
let username = self.textField_username.text, !username.isEmpty,
let eMail = self.textField_eMail.text, !eMail.isEmpty,
let password = self.textField_password.text, !password.isEmpty,
let confirmPassword = self.textField_confirmPassword.text,
password == confirmPassword
else
{
//button is gray
self.button_register.backgroundColor = UIColor(red:0.20, green:0.29, blue:0.37, alpha:1.0)
return
}
//button is green
self.button_register.backgroundColor = UIColor(red:0.10, green:0.74, blue:0.61, alpha:1.0)
}
【问题讨论】:
-
到底是什么问题?您已经在检查一系列条件以确定按钮是否可以启用,那么为什么不将开关的状态添加到该列表中呢?
-
@Caleb 当我只是将开关添加到列表中时,我首先在 textFields 中输入所有内容,然后启用开关。此时按钮仍然是灰色的。然后我必须先在文本字段中再次更改一些内容以使其正常工作...
-
@Caleb 所以我在方法中添加了 self.switch_aGB.addTarget(self.... 并且还写了 "let switch_aGB = self.switch_aGB, switch_aGB.isOn == true" 给守卫.. .现在发生的情况是,每次我尝试按下开关时,模拟器都会死掉,并在 AppDelegate 中出现“线程 1:信号 SIGABRT”和错误消息:“libc++abi.dylib:以未捕获的异常终止类型 NSException (lldb)"
-
我注意到
textFieldsIsNotEmpty()期望sender是一个文本字段,因此在不进行任何修改的情况下传入一个开关可能会出现问题(每个控件在发送其操作消息时都会自行传递) .您可以将其更改为sender的类型为UIControl,然后考虑方法内部的具体类型。 -
@Caleb 现在可以工作了!我在 TextFieldIsNotEmpty 方法中告诉发件人是“任何”,然后添加了 switch.isOn == true 的保护。非常感谢!