微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

未启用 isActive 的 NavigationLink 打开目的地

如何解决未启用 isActive 的 NavigationLink 打开目的地

我有一个带有简单文本的 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 从来都不是真的,为什么会忽略这一点?

错误的实现(如我所想)还是快速错误

解决方法

这是怎么回事?

您可能误解了 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)
        }
    }
}
,

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

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

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 !!
            })
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?