![](/img/trans.png)
[英]'init(_:isActive:destination:)' was deprecated in iOS 16.0: use NavigationLink(_:value:) inside a NavigationStack or NavigationSplitView
[英]NavigationLink open destination without isActive enabled
我有一个带有简单文本的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
永远不会为真,为什么会被忽略?
是错误的实现(如我所想)还是 swift 错误?
它出什么问题了?
您可能误会了isActive
的角色。 它不是用于启用/禁用链接。 无论目标视图当前是否处于活动状态,它都旨在保存 state。
你为什么不简单地使用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 !!
})
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.