在 SwiftUI 视图中的 TextField 后面使用多个 SecureField 时的奇怪行为

Posted

技术标签:

【中文标题】在 SwiftUI 视图中的 TextField 后面使用多个 SecureField 时的奇怪行为【英文标题】:Odd behavior when using multiple SecureFields following a TextField in a SwiftUI view 【发布时间】:2020-11-14 22:19:04 【问题描述】:

注意:此错误已在 Xcode 13.0 beta 3 中修复

在视图中跟随 TextField 时尝试使用多个 SecureField 时,我遇到了非常奇怪的行为。尝试在其中一个 SecureField 中输入文本会在一个字符处停止,该字段变为黄色并显示“强密码”,并在第二个 SecureField 中重复。这发生在 Xcode 12.2 中的 ios 14.2 上的 Xcode 预览和模拟器中。

这是一个演示该问题的最小示例:

struct SecureFieldTestView: View 

    @State var displayName: String = ""
    @State var password = ""
    @State var passwordVerifiation = ""

    var body: some View 
        VStack 
            TextField("Display name", text: $displayName)
            SecureField("Password", text: $password)
            SecureField("Verify Password", text: $passwordVerifiation)

        
        .padding()
    


struct SecureFieldTestView_Previews: PreviewProvider 
    static var previews: some View 
        SecureFieldTestView()
    

运行模拟器时控制台显示如下错误:

[AutoFill] Cannot show Automatic Strong Passwords for app bundleID: <REDACTED BY ME> due to error: iCloud Keychain is disabled
[Assert] View <(null):0x0> does not conform to UITextInput protocol

我已尝试将 SecureFields 包装到它们自己的 VStack 中并将它们全部包装到一个 Form 中,但问题仍然存在。

我是否缺少明显的东西,或者这是 SDK 中的错误?

【问题讨论】:

这似乎又是 SwiftUI 中的一个非常好的错误.. 可能会提交错误报告 归档于 FB8897960 2021 年在 Xcode 13.0 (13A233) 中遇到同样的问题。我计划将我的 Xcode 更新到最新版本,看看这个 bug 是否仍然存在。 在 Xcode 13.1 (13A1030d) 中遇到同样的问题 :( 【参考方案1】:

我会向 Apple 报告有关此问题的错误...

但是,目前这里有一个解决方法来解决这个问题,并且仍然使用 SecureField 而不是顶部的黄色条..

SecureField("First", text: $password)
    .textContentType(.newPassword)

只需为 newPassword 添加 textContentType,该栏不会出现。

【讨论】:

谢谢你,我试了一下,如果其中一个 SecureFields 是第一个文本条目,它确实有效。如果 TextField 条目是第一个文本条目,它将无法工作。我做了一些进一步的调查,发现问题与 iCloud 有关,请参阅我的答案以获取更多信息。 我自己也遇到过这个问题。不幸的是, .newPassword 对我不起作用。我认为还有其他 TextFields。如果我首先选择其中一个密码字段,则解决方法有效。但是,如果我先填充其中一个 TextField,然后选择 SecureField,我会得到上述行为。【参考方案2】:

经过进一步调查,还有另一个问题正在发生;软件键盘要经过一段时间才会出现。在软件键盘出现之前在 SecureFields 中输入文本始终会产生问题。等待软件键盘出现可以解决奇怪的行为。

奇怪的是,当设备/模拟器没有登录到 iCloud 时,键盘出现的延迟似乎发生了;设备登录时不会出现键盘出现延迟和 SecureField 问题。

【讨论】:

以上是关于在 SwiftUI 视图中的 TextField 后面使用多个 SecureField 时的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Stack内的SwiftUI TextField锁定无法访问

SwiftUI 获取 TextField 或任何视图的坐标

_PathPoint 类和 _PointQueue 类错误,不使用任何 pod。只需点击swiftui中的textField?

SwiftUI TextField 中的货币输入

SwiftUI:如何从核心数据中的 TextField 中保存值

SwiftUI - 如何在另一个视图中响应 TextField onCommit?