我的问题是,SecureField in SwiftUI在任何时候都不会显示用户输入的字符,它只是在键入字符时直接显示每个字符的“·”符号--而在UIKit中,UITextField (与isSecureTextEntry = true一起)在隐藏‘·’之前先显示最新的字符。
我公司的UX测试人员要求我带回“旧行为”--但这种行为似乎不属于任何公共API的一部分。
有趣的是,这也适用于使用UITextField注入到SwiftUI中的UIViewRepresentable自定义类--它们以上面描述的"SwiftUI方式“运行。那么,在SwiftUI中对所有安全的UITextField行为都进行了一些上下文行为修改吗?我必须将我的SwiftUI表单完全重写为一个完整的UIViewController,才能恢复行为(使用安全的UITextFields do以模式方式推动UIViewControllers,展示所需的行为)。
这是SwiftUI中的一种副业错误吗?我在SwiftUI的iOS13和14中都看到了同样的情况。有人看到了解决办法或解决方案吗?
-编辑-
在下面对@Asperi进行了很好的解释之后,我注意到我的UITextField自定义类使用UIViewRepresentable注入到SwiftUI中,通过不必要地在updateUIView调用中设置文本绑定来强制这种行为。使用协调器只处理文本逻辑,解决了我在使用这种方法时遇到的问题。
发布于 2020-12-02 17:20:55
所观察到的效果是由于立即应用于绑定字符串状态和立即响应/重建视图。
为了带来想要的行为,我们需要以某种方式推迟状态更新,从而给SecuredField/UITextField在不与状态同步的情况下更新自我的机会。
这里是一个可能的方向的演示(这不是理想的,但一段路要走)。用Xcode 12.1 / iOS 14.1测试。

struct DemoSecureFieldView: View {
@State private var password = "demo"
var textBinding: Binding<String> {
Binding(get: { password },
set: { value in
// more logic can be added to delay _only_ if new symbol added,
// and force apply if next symbol came fast
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
password = value
}
}
)
}
var body: some View {
VStack {
SecureField("Placeholder", text: textBinding)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
}.background(Color.pink)
}
}https://stackoverflow.com/questions/65111560
复制相似问题