resignFirstResponder работает не так, как ожидалось. Клавиатура всплывает вниз при каждом нажатии клавиши, а не только для возврата - PullRequest
0 голосов
/ 10 октября 2019

у меня есть 3 UITextField. когда я устанавливаю resignFirstResponder для текстового поля, при каждом нажатии клавиши клавиатура опускается, и клавиатура всплывает, когда мы входим. это означает, что для каждой нажатой буквы клавиатура исчезает

Я попытался создать выход для текстового поля, как показано ниже, но оператор печати выполняется, но клавиатура не исчезает, когда фокус теряется или перемещается к следующему тексту. поле

         @IBAction func done(_ sender: UITextField) {
                print("Text field done$$$$$$$$$$$$$$$")
                sender.endEditing(true)
                sender.resignFirstResponder()
        //        print("After Resign")
            } 

пробовал и следующее:

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) 
     override func viewDidLayoutSubviews() {

            super.viewDidLayoutSubviews()

            //Textfield
            let textfield = UITextField()
            textfield.setShadowTextField(username, "user-name")
            textfield.setShadowTextField(useremail, "email")
            textfield.setShadowTextField(userPhone, "phone")

            //Hide Keyboard
           textName.resignFirstResponder()
            textEmail.resignFirstResponder()
            userPhone.resignFirstResponder()
            //
            name = textName.text ?? ""
            emailphone = textEmail.text ?? ""

            //Button

            if isFirstTimeSubView == true {
                button?.setSemiButtonLeft(btnFemaleSelector, shadowViewFemale)
                button?.setGradientButton(btnFemaleSelector, startColor: "0d5e90", endColor: "8ec67d")

                button?.setSemiButtonRight(btnMaleSelector, shadowViewMale)
                button?.setGradientButton(btnMaleSelector, startColor: "FFFFFF", endColor: "FFFFFF")
                isFirstTimeSubView = false
            }


            button?.setRoundButton(btnSubmit, shadowView)
            button?.setGradientButton(btnSubmit, startColor: "0d5e90", endColor: "8ec67d")

            //textNam.sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)
    //        self.userText.delegate = selftextName.resignFirstResponder()
        }
extension UITextField {
    func setShadowTextField(_ textfield: UITextField?, _ imagename: String?) {
        // set color & border
        textfield?.borderStyle = .none
        textfield?.backgroundColor = UIColor.white
        // set corner
        textfield?.layer.cornerRadius = (textfield?.frame.size.height ?? 0.0) / 2
        //set shadow
        textfield?.layer.shadowOpacity = 0.4
        textfield?.layer.shadowRadius = 15
        textfield?.layer.shadowOffset = CGSize(width: 5, height: 10)
        textfield?.layer.shadowColor = UIColor.gray.cgColor
        // set icon & Placeholder position
        let UIViewController = UIView(frame: CGRect(x: 0, y: 0, width: 60, height: textfield?.frame.size.height ?? 0.0))
        let icon = UIImageView(image: UIImage(named: imagename ?? ""))

        icon.frame = CGRect(x: 0, y: 0, width: UIViewController.frame.size.width / 4, height: UIViewController.frame.size.height / 4)
        icon.center = UIViewController.center

        UIViewController.addSubview(icon)
        textfield?.leftView = UIViewController
        textfield?.leftViewMode = .always
    }
}

1 Ответ

0 голосов
/ 10 октября 2019

Вопрос немного неясен, но если вы хотите, чтобы клавиатура выключалась, когда вы нажимали кнопку «Готово», вы должны реализовать UITextFieldDelegate на вашем контроллере представления и во время вызова метода textFieldShouldReturn(_:) resignFirstResponder оттуда:

class myVC: UIViewController, UITextFieldDelegate{    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        return true
    }
}

и не забудьте установить делегата в viewDidLoad для вашего VC:

override func viewDidLoad() {
    super.viewDidLoad()
    /// Text field delegate handling
    textFieldFirstName.delegate = self
}

https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619603-textfieldshouldreturn?language=objc

Вызвав resignFirstResponder в viewDidLayoutSubviews, выотказываются от ответчика каждый раз, когда вызывается viewDidLayoutSubviews, т. е. когда границы изменяются для представления контроллера представления, представление корректирует позиции его подпредставлений, и затем система вызывает этот метод. Поэтому я предполагаю, что клавиатура будет изменять границы, вызывая срабатывание viewDidLayoutSubviews после каждого нажатия клавиши и создавая поведение, которое вы видите

...