簡體   English   中英

未啟用 isActive 的 NavigationLink 打開目的地

[英]NavigationLink open destination without isActive enabled

我有一個帶有簡單文本的NavigationLink 如果確定的條件得到驗證,應該打開一個秘密登錄頁面。

但我注意到我可以通過兩個簡單的技巧繞過“ isActive ”:

  1. 長按文本並釋放,秘密視圖自動加載
  2. 按下並拖動文本,秘密視圖自動加載

所以我決定實施並抓住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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM