【问题标题】:Password field's keyboard switches from azerty to qwerty (sometimes) only on iOS 12密码字段的键盘仅在 iOS 12 上从 azerty 切换到 qwerty(有时)
【发布时间】:2019-03-30 22:30:53
【问题描述】:

我在Swift 4 中编写了一个iOS 应用程序,我是法国人,所以我在法语/法语地区使用手机。

使用 iOS 12 设备,我的登录页面上的密码字段工作得非常好(保存密码的自动登录甚至可以工作,我没有做任何事情来让它工作),但在我的注册页面上,该字段让我的键盘从 AZERTY 切换到 QWERTY。

我的手机设置中只有 AZERTY 键盘,它发生在所有 iOS 12 设备上,而不仅仅是我的...

我在代码中唯一做的事情:(我的 UIView 文件名为 RegisterView.swift)

fieldPwd = UITextField()
fieldPwdConfirm = UITextField()
fieldPwd.isSecureTextEntry = true
fieldPwdConfirm.isSecureTextEntry = true

这个问题有什么解决办法吗?谢谢!

【问题讨论】:

标签: ios swift keyboard textfield


【解决方案1】:

我已经为我的项目找到了解决方案,也许它可以帮助某人。

我注意到了:

  • 在我的登录页面(使用 1 个安全的UITextField),键盘是 AZERTY
  • 在我的登录页面(带有 2 个安全 UITextField),键盘是 QWERTY
  • 在我的帐户页面(带有 2 个安全 UITextField)中,键盘是 AZERTY

在对登录页面和帐户页面进行了一段时间比较后,我意识到在我的帐户页面中,安全文本字段之前的文本字段是 .numberPad 文本字段。

所以在我的登录 xib 文件中,我已将安全文本字段设置为 .numberPad,并在 textFieldDidBeginEditing 中将它们设置为 .default。然后在textFieldDidEndEditing 中再次回到.numberPad,因为如果没有,键盘会第二次出现在QWERTY 中。现在,我的安全文本字段位于 AZERTY 中。

func textFieldDidBeginEditing(_ textField: UITextField) {
    if ( textField == pwdTextField || textField == pwd2TextField ) {
        textField.keyboardType = .default;
    }
    // do other stuffs
}

func textFieldDidEndEditing(_ textField: UITextField) {
    if ( textField == pwdTextField || textField == pwd2TextField ) {
        textField.keyboardType = .numberPad;
    }
    // do other stuffs
}

@.@

【讨论】:

    【解决方案2】:

    这是因为应用默认区域设置。 从 info.plist 中删除以下设置。

    <dict>
       <key>CFBundleDevelopmentRegion</key>
       <string>fr</string>
       ...
    </dict>
    

    干杯...

    【讨论】:

    • @QuentinRth 这意味着你仍然有这个问题。您是否也尝试过其他解决方案,
    【解决方案3】:

    确实,使用 2 个密码内容类型的文本字段(例如,当用户必须确认新密码时)会导致键盘出现问题。如此处所述,键盘设置为 QWERTY,而它应该是 AZERTY(使用我使用的语言),当我从一个文本字段转到另一个文本字段时,键盘会闪烁。

    实际上,无需为密码文本字段设置此内容类型,对两个文本字段使用“新密码”内容类型就可以正常工作,并且不会对键盘造成任何问题。

    【讨论】:

    • 对我不起作用,即使文本字段类型为“新密码”或“未指定”,我也会得到一个 qwerty 字段。让我的 azerty 键盘回到这个字段的唯一方法是关闭“安全文本输入”功能。
    • 更新:关闭“安全文本输入”和内容类型“新密码/密码”我遇到了同样的问题(并且密码清晰)
    • 好吧,我想问题出在其他地方,因为我在 AZERTY 中使用键盘同时仍启用安全文本输入属性就足够了。从一个文本字段切换到另一个文本字段时没有键盘闪烁。大多数 textFields 属性在 IB 中设置为默认值(除了更正和拼写检查设置为否和大写设置为无)。两个“新密码”文本字段都在同一个 stackView 中。我的设备(iPhone 8、iOS 13.5.1)也在使用法语。
    【解决方案4】:

    同样的问题: https://github.com/xlbs-rm/ios-demo

    在此处填写错误报告:https://feedbackassistant.apple.com/ 日期 2020-07-31

    Apple 尚未作出任何反应 iOS 13.5.1、13.7、12.4.3 上的问题 已连接设备(调试)、模拟器、TestFlight Alpha 版本(适用于 iTunesConnect 用户)、TestFlight Beta 版本(Apple 批准的 TestFlight 版本)上的问题

    唯一的解决方案是删除第二个密码字段!

    想法 #2 textContentType = .oneTimeCode 此处建议:https://stackoverflow.com/a/53760545

    if #available(iOS 12.0, *) {
        tfPassword.textContentType = .oneTimeCode
    }
    
    • 不工作
    • 未删除警告“无法显示应用程序的自动强密码...”

    想法 #3 删除 CFBundleDevelopmentRegion

    • 不工作

    想法#4 entend UITextField,用正确的语言覆盖 textInputMode 返回一个 类似于这里:https://stackoverflow.com/a/52701639

    • 不工作

    解决方案:

    if #available(iOS 12.0, *) {
        passInput.textContentType = .newPassword
    }
    

    实现:UITextFieldDelegate

    public func textFieldDidBeginEditing(_ textField: UITextField) {
        if exchangeResponder == false {
          exchangeResponder = true
          firstnameInput.becomeFirstResponder()
          textField.becomeFirstResponder()
          exchangeResponder = false
        }
    }
    
    passInput.delegate = self
    pass2Input.delegate = self
    

    现在我可以在所有字段之间移动,并且每次都可以使用德语键盘!

    【讨论】:

      猜你喜欢
      • 2015-02-08
      • 2020-07-29
      • 2018-01-19
      • 2020-07-14
      • 2013-10-26
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多