在SwiftUI视图中,在TextField之后使用多个SecureFields时的奇怪行为

在SwiftUI视图中,在TextField之后使用多个SecureFields时的奇怪行为,swiftui,Swiftui,在视图中跟踪文本字段时,尝试使用多个SecureFields时,我遇到了非常奇怪的行为。尝试在其中一个SecureField中输入文本会在一个字符处停止,该字段变为黄色并显示“强密码”,并且在第二个SecureField中重复。这发生在iOS 14.2上的Xcode 12.2上的Xcode预览和模拟器中 下面是一个演示此问题的简单示例: struct SecureFieldTestView: View { @State var displayName: String = "&

在视图中跟踪文本字段时,尝试使用多个SecureFields时,我遇到了非常奇怪的行为。尝试在其中一个SecureField中输入文本会在一个字符处停止,该字段变为黄色并显示“强密码”,并且在第二个SecureField中重复。这发生在iOS 14.2上的Xcode 12.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
[AutoFill]无法显示应用程序绑定ID:的自动强密码,因为错误:iCloud Keychain已禁用
[Assert]视图不符合UIT输出协议
我已经尝试将securefield包装到它们自己的VStack{}中,并将它们全部包装到一个表单{},但问题仍然存在


是否有明显的东西我遗漏了,或者这是SDK中的一个bug?

我会向苹果报告一个关于这个问题的bug

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

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

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

在进一步调查中,出现了另一个问题;软件键盘在延迟一段时间后才会出现。在软件键盘出现之前在SecureFields中输入文本会持续产生问题。等待软件键盘出现可以解决这种奇怪的行为


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

这似乎又是SwiftUI中的一个不错的错误。。可能会在FB8897960下提交一个bug报告谢谢,我尝试了一下,如果其中一个SecureFields是第一个文本条目,它确实可以工作。如果TextField条目是第一个文本条目,则它将失败。我做了进一步的调查,发现这个问题与iCloud有关,更多信息请参阅我的答案。我自己也遇到过这个问题。不幸的是,.newPassword对我不起作用。我的视图中还有其他文本字段。如果我先选择其中一个密码字段,解决方法就会起作用。但是,如果我先填充其中一个文本字段,然后选择一个SecureField,则会得到上述行为。