Сброс символов слева UILabel, если UITextField скрыт - PullRequest
0 голосов
/ 03 июля 2018

у меня 5 UITextFields. 2 видны, и 3 может быть дополнительно «добавлено» при нажатии кнопки (в основном .isHidden = false, но дает иллюзию, что ее добавление дополнительно). 3 дополнительные UITextFields также имеют кнопку удаления (как rightView), которая при нажатии делает анимацию .isHidden = true.

Теперь у каждого UITextField есть UILabel (как rightView), который показывает оставшиеся символы. Проблема в том, что когда пользователь нажимает эту кнопку удаления и соответствующий UITextField снова скрывается, но оставшиеся символы UILabel сохраняет свое старое значение. Я не уверен, как сбросить это. Это код:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else { return true }
    let newLength = text.count + string.count - range.length

    var rightView = UIView()
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
    label.font = UIFont(name: Fonts.OpenSans_Light, size: 14)

    if textField === firstChoiceTextField || textField === secondChoiceTextField {
        rightView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 25))
    }

    if textField === thirdChoiceTextField || textField === forthChoiceTextField || textField === fifthChoiceTextField {
        rightView = UIView(frame: CGRect(x: 0, y: 0, width: 55, height: 25))
        let button = UIButton(frame: CGRect(x: rightView.frame.width - 30, y: 0, width: 25, height: 25))
        button.setBackgroundImage(UIImage(named: "icon_cancel_dark"), for: .normal)
        button.addTarget(self, action: #selector(self.hideTextField(_:)), for: .touchUpInside)
        rightView.addSubview(button)
    }

    rightView.addSubview(label)
    textField.rightView = rightView
    textField.rightViewMode = .always
    label.textAlignment = .center

    // when the text field has been hidden with the hideTextField method below, the characters left label still shows the old count if the label is being shown again

    if newLength <= 35 {
        label.text =  String(50 - newLength)
        label.textColor = .lightGray
    }
    else {
        label.text =  String(50 - newLength)
        label.textColor = UIColor.red
    }

    return newLength < 50
}


@objc func hideTextField(_ sender: UIButton) {
    if let  field = sender.superview?.superview as? UITextField, !field.isHidden {
        UIView.animate(withDuration: 0.2) {
            field.text = ""
            field.isHidden = true
        }
    }
    if !self.thirdChoiceTextField.isHidden && !self.forthChoiceTextField.isHidden && !self.fifthChoiceTextField.isHidden {
        self.addTextFieldButton.isEnabled = false
    }
    else{
        self.addTextFieldButton.isEnabled = true
    }
}

1 Ответ

0 голосов
/ 03 июля 2018

В методе hideTextField(_ sender: UIButton) вы можете получить label из rightView из UITextfield, который будет скрываться, как показано ниже

    if let  field = sender.superview?.superview as? UITextField, !field.isHidden {

        if let label = field.rightView?.subviews.filter({ $0 is UILabel }).first as? UILabel {
            print("I am the label. reset me")
            label.text = ""
        }
        UIView.animate(withDuration: 0.2) {
            field.text = ""
            field.isHidden = true
        }
    }
...