Xcode: уволить клавиатуру после нажатия автозаполнения - PullRequest
0 голосов
/ 26 апреля 2020

В Swift я хочу определить, когда пользователь завершил добавление своего имени пользователя / пароля, используя автозаполнение (от https://developer.apple.com/documentation/security/password_autofill), и не открывать клавиатуру повторно, поскольку они предположительно сделаны с помощью клавиатуры.

Вот как я настроил их вводы имени пользователя и пароля:

override func viewDidLoad() {
    super.viewDidLoad()
    name.textContentType = .username
    password.textContentType = .password

    loginButton.addTarget(self, action: #selector(self.loginPressed), for: .touchUpInside)
}

@objc func loginPressed() {
    // Making server calls here
}

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

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

При нажатии на textField клавиатура появляется с

 becomeFirstResponder()

. Вы можете использовать

 resignFirstResponder()  

или сделать расширение, чтобы скрыть клавиатуру

 extension UIViewController
{
    func hideKeyboard()
   {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(
        target: self,
        action: #selector(UIViewController.dismissKeyboard))

    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
   }

    @objc func dismissKeyboard()
   {
        view.endEditing(true)
   }
}

Просто поместите

 hideKeyboard() 

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

0 голосов
/ 28 апреля 2020
override func viewDidLoad() {
    super.viewDidLoad()
     name.textContentType = .username
     password.textContentType = .password

    //set delegate
      name.delegate = self
      password.delegate = self

      loginButton.addTarget(self, action: 
                #selector(self.loginPressed), 
         for: .touchUpInside)
}

@objc func loginPressed() {
// Making server calls here
}
extension UIViewController: UITextFieldDelegate
{
   func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
       if textField == name
       {
          DispatchQueue.main.async {
            self.view.endEditing(true)
         }
       }
       return true
   }
}
0 голосов
/ 26 апреля 2020

Когда пользователь использует автозаполнение, в зависимости от того, какой тип представления вы используете для ввода текста, вызывается определенный метод делегата, а также textDidChangeNotification ( docs ). Для UITextField используется метод (textField(_:shouldChangeCharactersIn:replacementString:)). Передаваемая строка соответствует новой добавленной строке, и «обычно содержит только один введенный новый символ», но если пользователь использует автозаполнение или вставляет пароль, количество символов в строке будет больше. Вы можете попробовать проверить это и вызвать endEditing, если добавлено более одного нового символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...