如何判断SecureField是否正在编辑

4

我正在使用SecureField构建登录页面,但我注意到它没有onEditingChanged事件,因此我们无法知道它是否已经成为了第一响应者。有没有解决这个问题的方法?


你也遇到了这个问题吗?找到解决方案了吗?看起来苹果不希望观察“SecureField”。我可以想象为什么,但我也需要知道原因 :) - Björn Ro
你找到这个问题的答案了吗?现在已经是2023年了,但仍然无法确定SecureField何时被聚焦。 - Shailesh
2个回答

0
你可以创建一个模型类来保存secureText值的变量(在你的情况下应该是LoginModel或类似的名称)。然后将该值绑定到secureField文本上,并在模型中的Published变量上添加didSet。以下是一个示例:
模型:
class SecureFieldModel: ObservableObject {
    @Published var secureText = "" {
        didSet {
            print(secureText)
        }
    }
}

视图:

@ObservedObject var model = SecureFieldModel()
    
struct LoginView: View {
   var body: some View {
      SecureField("Type your text here", text: $model.secureText)
   }
}

2
我认为你可能误解了我的问题。如果文本字段只是聚焦,还没有文本,我们无法获取事件。 - RayChen

0
我认为你可能误解了我的问题。如果文本字段只是焦点,还没有文本,我们无法获取事件。- RayChen 3小时前
Mantas的答案稍作修改。当输入文本具有内容或处于活动状态时,“触发”:
struct ContentView: View {
    
    @ObservedObject var model = SecureFieldModel()
    
    var body: some View {
        // No info when focus removed
        SecureField("Type your text here", text: $model.secureText)
            .onTapGesture { // when active
                self.model.textFieldActivated()
            }

        // Do something when focus removed
        SecureField("Type your text here", text: $model.secureText, onCommit: {print("Commited and focus removed")})
            .onTapGesture { // when active
                self.model.textFieldActivated()
            }
    }
}

class SecureFieldModel: ObservableObject {
    @Published var secureText = "" {
        didSet {
            // if text
            if secureText.count >= 1 {
                print(secureText)
            }
        }
    }
    
    func textFieldActivated() {
        if secureText.count >= 1 {
            print(secureText)
        } else {
            print("is active")
        }
    }
}

1
这将导致一个问题,即您不知道焦点何时被移除。您必须在别处处理它,而这可能会很混乱。 - Björn Ro
我看不出你的问题所在。只需将 onCommit 添加到文本字段即可。我已相应修改了代码。 - Simon
2
onCommit 仅在用户按下回车键时使用。这意味着当点击另一个文本字段或以其他方式关闭键盘时,它不会激活该闭包。 - Björn Ro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接