密码字段的键盘仅在 iOS 12 上从 azerty 切换到 qwerty(有时)

Posted

技术标签:

【中文标题】密码字段的键盘仅在 iOS 12 上从 azerty 切换到 qwerty(有时)【英文标题】:Password field's keyboard switches from azerty to qwerty (sometimes) only on iOS 12 【发布时间】: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

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

【问题讨论】:

How to show specific language keyboard when user input values in UITextField in iPhone App?的可能重复 不,但还是谢谢。本主题主要针对 iOS 12,因为此问题仅出现在 iOS 12 上,希望我们能找到解决方案,以便对其他人有所帮助 这似乎是一个已知问题; ***.com/questions/52701160/…。我建议你向 Apple 提交一份大报告。 感谢@Paulw11,我搜索了但没有找到!希望苹果能尽快解决这个问题…… 你找到解决这个问题的方法了吗? 【参考方案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://***.com/a/53760545

if #available(iOS 12.0, *) 
    tfPassword.textContentType = .oneTimeCode

不工作 未删除警告“无法显示应用程序的自动强密码...”

想法 #3 删除 CFBundleDevelopmentRegion

不工作

想法#4 entend UITextField,用正确的语言覆盖 textInputMode 返回一个 类似于这里:https://***.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

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

【讨论】:

以上是关于密码字段的键盘仅在 iOS 12 上从 azerty 切换到 qwerty(有时)的主要内容,如果未能解决你的问题,请参考以下文章

仅在一页上从 AJAX POST 获取 NTLM 挑战

iOS - 当文本字段在子视图内时,键盘上的 UIScroll 弹出到文本字段

排毒:iOS 模拟器如何在键盘上按 Next

确保 iOS 4 应用程序仅在设备满足特定密码条件时运行

为 Web 应用程序创建 HTML 密码屏幕

iOS 14 更新后应用程序在文本字段上冻结