[英]'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.