【问题标题】:Xcode / Swift | Knowing if a UISwitch is turned on at any timeXcode / 斯威夫特 |随时了解 UISwitch 是否打开
【发布时间】:2018-10-17 01:27:54
【问题描述】:

基本上,我们现在得到的是一个按钮,可以根据 TextFields 是否填写来更改其颜色(灰色和绿色)...现在我想添加一个也必须打开的开关让按钮颜色变为绿色,如果不是,则变为灰色。 我究竟如何实现这部分? PS: setupAddTargetIsNotEmptyTextFields() 在 vi​​ewDidLoad() 中被调用

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 的保护。非常感谢!

标签: swift xcode uiswitch


【解决方案1】:

当我只是将开关添加到列表中时,我首先在 textFields 中输入所有内容,然后启用开关。此时按钮仍然是灰色的。然后我必须先在文本字段中再次更改一些内容才能使其正常工作。

听起来正在发生的事情是开关未设置为像文本字段那样触发textFieldsIsNotEmpty 操作。你可以很容易地解决这个问题:只需将开关配置为也调用该操作:

func setupAddTargetIsNotEmptyTextFields() {
    self.textField_username.addTarget(self, action: #selector(textFieldsIsNotEmpty), for: .editingChanged)
    // ...yada yada yada...        
    self.switch_selfDestructEnable.addTarget(self, action: #selector(textFieldsIsNotEmpty), for: .valueChanged)
}

现在,当它的值发生变化时,开关将发送textFieldsIsNotEmpty,就像文本字段一样。接下来,修改textFieldsIsNotEmpty() 以检查开关的状态以及各种文本字段的状态,您应该会得到您想要的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多