SwiftUI - 在禁用的 SecureField 中检测点击?
SwiftUI - Detect taps in a disabled SecureField?
我正在使用 SwiftUI 编写 iOS 应用程序。作为所提供数据的一部分,我需要一个密码字段,其中包含一个 show/hide 按钮,可在 hidden/visible 之间切换。为此,我结合使用了 SwiftUI 的 SecureField
和 TextField
控件。两者都处于 disabled
状态以防止用户编辑,因为我希望此字段为只读。此设置运行良好。 (见下方截图)
现在我想添加允许用户只需点击密码即可将密码复制到剪贴板的功能。我在我的 SecureField
中添加了一个 onTapGesture
块,但它从未被调用过。我相信这是因为我的 SecureField
/TextField
被标记为已禁用。我的代码片段如下:
ZStack(alignment: .trailing) {
if isSecured {
VStack {
SecureField("", text: Binding.constant(text))
.disabled(true)
.onTapGesture {
print("USER TAPPED!")
}
}
} else {
TextField("", text: Binding.constant(text))
.disabled(true)
}
Image(systemName: self.isSecured ? "eye" : "eye.slash")
.accentColor(.gray)
.foregroundColor(.gray)
.frame(width: 20, height: 20, alignment: .center)
.modifier(TouchDownUpEventModifier(changeState: { (buttonState) in
withAnimation {
self.isSecured.toggle()
}
}))
}
有没有办法做到这一点?我希望我的 SecureField
/TextField
是只读的,但仍然检测用户何时点击控件?
我可以通过在 ZStack
上添加以下修饰符来解决这个问题:
.contentShape(Rectangle())
.onTapGesture {
...
}
完成此操作后,我的 ZStack
开始拦截触摸事件,我可以执行所需的操作。
我正在使用 SwiftUI 编写 iOS 应用程序。作为所提供数据的一部分,我需要一个密码字段,其中包含一个 show/hide 按钮,可在 hidden/visible 之间切换。为此,我结合使用了 SwiftUI 的 SecureField
和 TextField
控件。两者都处于 disabled
状态以防止用户编辑,因为我希望此字段为只读。此设置运行良好。 (见下方截图)
现在我想添加允许用户只需点击密码即可将密码复制到剪贴板的功能。我在我的 SecureField
中添加了一个 onTapGesture
块,但它从未被调用过。我相信这是因为我的 SecureField
/TextField
被标记为已禁用。我的代码片段如下:
ZStack(alignment: .trailing) {
if isSecured {
VStack {
SecureField("", text: Binding.constant(text))
.disabled(true)
.onTapGesture {
print("USER TAPPED!")
}
}
} else {
TextField("", text: Binding.constant(text))
.disabled(true)
}
Image(systemName: self.isSecured ? "eye" : "eye.slash")
.accentColor(.gray)
.foregroundColor(.gray)
.frame(width: 20, height: 20, alignment: .center)
.modifier(TouchDownUpEventModifier(changeState: { (buttonState) in
withAnimation {
self.isSecured.toggle()
}
}))
}
有没有办法做到这一点?我希望我的 SecureField
/TextField
是只读的,但仍然检测用户何时点击控件?
我可以通过在 ZStack
上添加以下修饰符来解决这个问题:
.contentShape(Rectangle())
.onTapGesture {
...
}
完成此操作后,我的 ZStack
开始拦截触摸事件,我可以执行所需的操作。