首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI SecureField:如何实现与UIKit相同的字符模糊行为?

SwiftUI SecureField:如何实现与UIKit相同的字符模糊行为?
EN

Stack Overflow用户
提问于 2020-12-02 15:53:16
回答 1查看 376关注 0票数 3

我的问题是,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调用中设置文本绑定来强制这种行为。使用协调器只处理文本逻辑,解决了我在使用这种方法时遇到的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 17:20:55

所观察到的效果是由于立即应用于绑定字符串状态和立即响应/重建视图。

为了带来想要的行为,我们需要以某种方式推迟状态更新,从而给SecuredField/UITextField在不与状态同步的情况下更新自我的机会。

这里是一个可能的方向的演示(这不是理想的,但一段路要走)。用Xcode 12.1 / iOS 14.1测试。

代码语言:javascript
复制
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)
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65111560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档