繁体   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