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 按钮操作,而不是单击释放