【问题标题】:NavigationLink open destination without isActive enabled未启用 isActive 的 NavigationLink 打开目的地
【发布时间】:2021-01-27 23:33:36
【问题描述】:

我有一个带有简单文本的NavigationLink。如果确定的条件得到验证,应该打开一个秘密登录页面。

但我注意到我可以通过两个简单的技巧绕过“isActive”:

  1. 长按文字然后松开,秘密视图会自动加载
  2. 按住并拖动文本,秘密视图会自动加载

所以我决定实施并抓住longPress
实现它,我解决了第一个问题,但秒数仍然存在。

这里有一个视频可以更好地解释这个问题:https://youtu.be/vuaT3lwUhLg

这里是视频中记录的简单sn-p:

// 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 从来都不是真的,为什么会被忽略?

是一个错误的实现(我想)还是一个快速的错误?

【问题讨论】:

    标签: ios swift button swiftui swiftui-ontapgesture


    【解决方案1】:

    我假设您只是想以编程方式激活导航,因此您需要像按钮或可点击视图和隐藏链接这样的活动元素。

    这是您的代码的可能解决方案

    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 效果很好。谢谢。
    【解决方案2】:

    这有什么问题?

    您可能误认为isActive 的角色。它不是用于启用/禁用链接。它旨在保持目标视图当前是否处于活动状态。

    你为什么不直接使用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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-11
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多