如何解决未启用 isActive 的 NavigationLink 打开目的地
我有一个带有简单文本的 NavigationLink
。如果确定的条件得到验证,应打开一个秘密登录页面。
但我注意到我可以通过两个简单的技巧绕过“isActive
”:
所以我决定实施并抓住longPress
。
实施它,我解决了问题 1,但秒仍然存在。
这里有一个视频可以更好地解释这个问题:https://youtu.be/vuaT3lwUhLg
这里是视频中记录的简单片段:
// the secret logged page
struct LoggedView: View {
var body: some View {
Text("secret view")
}
}
// the example
struct ContentView: View {
// loginSuccess is FALSE,so LoggedView() should not be called...
@State var loginSuccess: Bool = false
var body: some View {
NavigationView {
NavigationLink(destination: LoggedView(),isActive: $loginSuccess) {
Text("LOGIN")
.background(Color.yellow)
.foregroundColor(.black)
.padding()
.onTapGesture(perform: {
// false,disabled to show the issue
loginSuccess = false
})
// if not implemented,longpress load the secret view
.onLongPressGesture {}
}
}
}
}
这是怎么回事?loginSuccess
从来都不是真的,为什么会忽略这一点?
解决方法
这是怎么回事?
您可能误解了 isActive
的角色。它不是用于启用/禁用链接。它旨在保持目标视图当前是否处于活动状态。
为什么不简单地使用 disabled(_:)
?
struct ContentView: View {
@State var loggedViewActive: Bool = false
// loginSuccess is FALSE,so LoggedView() should not be called...
@State var loginSuccess: Bool = false
var body: some View {
NavigationView {
NavigationLink(destination: LoggedView(),isActive: $loggedViewActive) {
Text("LOGIN")
.background(Color.yellow)
.foregroundColor(.black)
.padding()
}
.disabled(!loginSuccess)
}
}
}
,
我假设您只是想以编程方式激活导航,因此您需要活动元素,如按钮或可点击视图和隐藏链接。
这是您的代码的可能解决方案
var body: some View {
NavigationView {
Text("LOGIN") // << activator !!
.background(Color.yellow)
.foregroundColor(.black)
.padding()
.onTapGesture(perform: {
// false,disabled to show the issue
loginSuccess = false
})
.background(
NavigationLink(destination: LoggedView(),isActive: $loginSuccess) {
EmptyView() // << hidden !!
})
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。