SwiftUI 在按钮上触发操作而无需用户单击按钮

Posted

技术标签:

【中文标题】SwiftUI 在按钮上触发操作而无需用户单击按钮【英文标题】:SwiftUI triggering action on button without user clicking on button 【发布时间】:2020-08-25 15:39:50 【问题描述】:

我创建了一个非常简单的登录视图。

我观察到一种非常奇怪的行为。当我在文本框内单击时,该单击最终会触发“登录”按钮上的“动作”。以下是负责设置这部分视图的代码。

var body: some View
        ZStack
            VStack(alignment: .center)
                TextField("Login", text: $model.userName).padding().border(/*@START_MENU_TOKEN@*/Color.black/*@END_MENU_TOKEN@*/, width: 1).cornerRadius(2.0)
                SecureField("Password",text:$model.password).padding().border(Color.black, width:1).cornerRadius(2.0)
                Toggle(isOn:$model.rememberMe)
                    Text("Remember me")
                
                if (model.loginFailed)
                    Text(model.errorMessage!).font(.footnote).foregroundColor(.red).animation(.easeIn)
                
                VStack
                    Button(action: signIn) 
                        Text("Login")
                    
                    Button(action:recoverPassword)
                        Text("Forgot Password?")
                    
                
                .padding().zIndex(100).disabled(model.loginInProgress)
            LoginInProgressIndicator().animation(.easeIn).zIndex(model.loginInProgress ? 200: 0).opacity(model.loginInProgress ? 0.9 : 0)
        
    

第一次单击任一文本框时,按钮上的“操作”会触发一些时间。有时它会在我尝试点击文本框内的几次尝试后触发。底线是“登录”按钮上的“动作”被触发而无需点击按钮。

代码的设置方式是否有问题。或者,当按钮属于组或其他内容时,需要做一些特殊的事情来处理按钮上的“动作”。

我们将不胜感激。

更新: 我添加了一些老式的诊断来检查视图中两个按钮的“动作”行为。事实证明,文本框中的时钟触发了两个按钮的操作。打印消息总是成对出现。

更多更新 问题更为普遍。单击顶层 VStack 中的任意位置会触发按钮上的操作。

【问题讨论】:

我对此做了更多的实验。即使我在文本框内单击,似乎也同时在两个按钮上触发了“动作”。 【参考方案1】:

问题在于该部分周围有一个表单元素。我有一个使用 Form 的封闭视图。此登录输入部分视图包含在其中。表单的行为似乎是,无论您在该表单内的哪个位置单击,它都会触发包含在其中的所有按钮操作。这真的不是我所期望的。

【讨论】:

以上是关于SwiftUI 在按钮上触发操作而无需用户单击按钮的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮后立即执行 SwiftUI 按钮操作,而不是单击释放

swiftui 文本字段和按钮内的按钮

SwiftUI 按钮无法在其整个区域上单击

无需单击按钮的表单的 JavaScript 功能

在 TextField 中的空格后自动触发 shift 按钮 - SwiftUI

如何使用在单击按钮上创建的用户触发放大和缩小绘图图表?