【发布时间】:2020-11-14 18:39:49
【问题描述】:
我有一个具有自定义 ButtonStyle 的导航链接:
NavigationLink(destination: NextScreen()) {
Text("Next")
}
.buttonStyle(CustomButtonStyle(disabled: !isValidPassword))
我的 CustomButtonStyle 看起来像这样:
@State var disabled = false
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.frame(minWidth: 0, maxWidth: .infinity)
.padding(15)
.foregroundColor(.white)
.background(disabled ? .black : .gray)
.cornerRadius(40)
.disabled(disabled) // this has no effect when inside a NavigationLink
}
用户输入密码时,用户界面会正确更新。
您可以看到我禁用了 ButtonStyle 内的按钮,但这并不妨碍用户仍然点击 NavigationLink 以转到 NextScreen()。
为了解决这个问题,我最终这样做了:
NavigationLink(destination: SignupStepBirthdayView()) {
Text("Next")
}
.buttonStyle(BobbleUpButtonStyle(disabled: !isValidPassword))
.disabled(!isValidPassword)
这似乎效率低下,因为我将禁用状态传递给按钮样式以更新 UI,然后不得不禁用实际的 NavigationLink。
有没有更好的方法来做到这一点?
【问题讨论】:
-
ButtonStyle 是关于按钮的视觉呈现(在这种情况下是链接),而不是关于行为。通过自定义样式,您禁用了 NavigationLink 内的文本标签,而不是链接本身 - 它应该在外部禁用,就像您已经做的那样。
标签: swift swiftui swiftui-navigationlink