未启用 isActive 的 NavigationLink 打开目标
NavigationLink open destination without isActive enabled
我有一个带有简单文本的 NavigationLink
。如果确定的条件得到验证,应该打开一个秘密登录页面。
但我注意到我可以通过两个简单的技巧绕过“isActive
”:
- 在文本上长按并松开,秘密视图自动加载
- 按住并拖动文本,秘密视图自动加载
所以我决定实施并赶上 longPress
。
实施它,我解决了第一个问题,但秒数仍然存在。
这里有一段视频可以更好地解释这个问题: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
永远不会为真,为什么会被忽略?
是错误的实现(如我所想)还是 swift 错误?
What's wrong with it?
您可能误会了 isActive
的角色。它不适用于 enabling/disabling link。它旨在保持目标视图当前是否处于活动状态。
你为什么不简单地使用 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)
}
}
}
我假设您只是想以编程方式激活导航,因此您需要活动元素,例如按钮或可点击视图和隐藏 link。
这是您的代码的可能解决方案
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 !!
})
}
}
我有一个带有简单文本的 NavigationLink
。如果确定的条件得到验证,应该打开一个秘密登录页面。
但我注意到我可以通过两个简单的技巧绕过“isActive
”:
- 在文本上长按并松开,秘密视图自动加载
- 按住并拖动文本,秘密视图自动加载
所以我决定实施并赶上 longPress
。
实施它,我解决了第一个问题,但秒数仍然存在。
这里有一段视频可以更好地解释这个问题: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
永远不会为真,为什么会被忽略?
是错误的实现(如我所想)还是 swift 错误?
What's wrong with it?
您可能误会了 isActive
的角色。它不适用于 enabling/disabling link。它旨在保持目标视图当前是否处于活动状态。
你为什么不简单地使用 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)
}
}
}
我假设您只是想以编程方式激活导航,因此您需要活动元素,例如按钮或可点击视图和隐藏 link。
这是您的代码的可能解决方案
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 !!
})
}
}