SwiftUI - 在禁用的 SecureField 中检测水龙头?

Posted

技术标签:

【中文标题】SwiftUI - 在禁用的 SecureField 中检测水龙头?【英文标题】:SwiftUI - Detect taps in a disabled SecureField? 【发布时间】:2021-07-12 18:29:28 【问题描述】:

我正在使用 SwiftUI 编写一个 ios 应用程序。作为提供的数据的一部分,我需要一个带有显示/隐藏按钮的密码字段,该按钮可以在隐藏/可见之间切换。为此,我使用了 SwiftUI 的 SecureFieldTextField 控件的组合。两者都处于disabled 状态以防止用户编辑,因为我希望此字段为只读。此设置运行良好。 (见下方截图)

现在我想添加功能,让用户只需点击它即可将密码复制到剪贴板。我在SecureField 中添加了一个onTapGesture 块,但它从未被调用。我相信这是因为我的SecureField/TextField 被标记为禁用。我的代码的 sn-p 如下:

        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 是只读的,但仍能检测到用户何时点击控件?

【问题讨论】:

【参考方案1】:

我可以通过在我的ZStack 上添加以下修饰符来解决这个问题:

.contentShape(Rectangle())
.onTapGesture 
   ...

完成此操作后,我的ZStack 开始拦截触摸事件,我可以执行所需的操作。

【讨论】:

以上是关于SwiftUI - 在禁用的 SecureField 中检测水龙头?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 在禁用的 SecureField 中检测水龙头?

我如何知道 SwiftUI 按钮是不是已启用/禁用?

如何在 SwiftUI 中禁用位置动画?

当视图出现在 SwiftUI 中时禁用动画

你如何在swiftUI中禁用navigationBaritems

在 SwiftUI 列表/表单中禁用滚动