iOS - Уведомления клавиатуры не срабатывают при переключении UITextfields - PullRequest
0 голосов
/ 04 октября 2018

Странное поведение происходит с уведомлениями .Мои уведомления срабатывали правильно, когда я переключал один UITextfield на другой.Но недавно я заметил, что теперь они не стреляют при переключении с одного UITextField на другое, а работают правильно, когда клавиатура скрыта. Apple изменил эту логику?

Мне нужно прокрутить поле до видимого, и поскольку наблюдатели сейчас не стреляют при переключении, поля не становятся видимыми прямоугольными.

Я создал альтернативу, разместив уведомление на textFieldDidBeginEditing, но я хотел бы вернуться назад, если это возможно.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

У меня была точно такая же проблема, и я решил ее путем создания accessoryView с новой кнопкой, которая является дублированием моей фактической кнопки.Итак, в основном, учтите, что у вас есть UIButton, который торчит в нижней части UIViewController, и у вас есть 2 UITextField, который при взаимозаменяемости не может чувствовать, что UIButton когда-либо перемещался в другое место, но остается застрявшим на клавиатуре,Следующий фрагмент кода объясняет, как решить эту проблему:

@IBOutlet weak var signInBtn: UIButton!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!

var accessoryViewKeyboard:UIView?
var btnAccessory:UIButton?


override func viewDidLoad() {
    super.viewDidLoad()

    passwordTextField.delegate = self
    emailTextField.delegate = self

    accessoryViewKeyboard = UIView(frame: signInBtn.frame)

    //Inputting the "accessoryViewKeyboard" here as the "inputAccessoryView" is of 
    //utmost importance to help the "signInBtn" to show up on tap of different "UITextFields"
    emailTextField.inputAccessoryView = accessoryViewKeyboard
    passwordTextField.inputAccessoryView = accessoryViewKeyboard

    setupBtnWithKeyboard()
}

func setupBtnWithKeyboard() {
    btnAccessory = UIButton(frame: CGRect(x: signInBtn.frame.origin.x, y: signInBtn.frame.origin.y, width: self.view.frame.size.width, height: signInBtn.frame.size.height))
    accessoryViewKeyboard?.addSubview(btnAccessory!)
    btnAccessory?.translatesAutoresizingMaskIntoConstraints = false
    btnAccessory?.frame = CGRect(x: (accessoryViewKeyboard?.frame.origin.x)!,
                                 y: (accessoryViewKeyboard?.frame.origin.y)!,
                                 width: self.view.frame.size.width,
                                 height: (accessoryViewKeyboard?.frame.size.height)!)

    btnAccessory?.backgroundColor = UIColor(red: 31/255, green: 33/255, blue: 108/255, alpha: 1)
    btnAccessory?.setTitle("Sign In", for: .normal)
    btnAccessory?.titleLabel?.font = .systemFont(ofSize: 22)
    btnAccessory?.titleLabel?.textColor = UIColor.white
    btnAccessory?.titleLabel?.textAlignment = .center
    btnAccessory?.isEnabled = true
    btnAccessory?.addTarget(self, action: #selector(SignIn.signInBtnPressed), for: .touchUpInside)

    NSLayoutConstraint.activate([
        btnAccessory!.leadingAnchor.constraint(equalTo:
            accessoryViewKeyboard!.leadingAnchor, constant: 0),
        btnAccessory!.centerYAnchor.constraint(equalTo:
            accessoryViewKeyboard!.centerYAnchor),
        btnAccessory!.trailingAnchor.constraint(equalTo:
            accessoryViewKeyboard!.trailingAnchor, constant: 0),
        btnAccessory!.heightAnchor.constraint(equalToConstant: signInBtn.frame.size.height),
        ])
}

И все готово.Это сохранит UIButton всегда присутствующим на клавиатуре.Важная вещь, независимо от того, сколько экземпляров UITextField вы вводите, всегда вводите accessoryViewKeyboard как inputAccessoryView.

0 голосов
/ 05 октября 2018

Я нашел реальную причину моей проблемы.Уведомления клавиатуры не будут вызываться при переключении, если UITextfield не имеет вспомогательного представления, а в случае вспомогательного представления они будут вызываться каждый раз ( Почему UIKeyboardWillShowNotification вызывается каждый раз, когда выбирается другой TextField? )

В моем случае у меня было дополнительное представление для каждого поля, но, добавляя дополнительное представление, я добавлял одно и то же представление ко всем полям, это было настоящей проблемой.Мне нужно было назначить отдельный экземпляр UIView для разных полей.Как только я это сделал, моя проблема исчезла.

...