如何在 LazyVGrid 中以编程方式触发 NavigationLink

2023-12-10

我有一个LazyVGrid里面一个NavigationView.

NavigationView {
    ScrollView {
        LazyVGrid(columns: columns) {
            ForEach(items) { item in
                NavigationLink(tag: item, selection: $displayedItem) {
                    DetailView(item)
                } label: {
                    GridItemView(item)
                }
            }
        }
    }
}

引用的变量在视图上定义如下:

@State var displayedItem: Item?
let columns: [GridItem] = Array(repeating: .init(.flexible()), count: 2)

现在我想显示特定项目的详细视图。我通过简单地将此项分配给displayedItem财产:

func showDetailView(for item: Item) {
    displayedItem = item
}

当相应的项目在屏幕上可见时,这非常有用LazyVGrid当我调用这个函数时。但是,当该项目不可见时,我首先需要滚动到该项目NavigationLink开火。我知道为什么会发生这种情况(因为这些项目是延迟加载的,这是一个lazy毕竟网格),但我不知道如何制作LazyVGrid当我需要时加载特定项目。


我尝试过的:

我还尝试通过包装整个内容以编程方式滚动到目标项目ScrollView里面一个ScrollViewReader并附加以下修饰符:

.onChange(of: displayedItem) { item in
    if let item = item {
        scrollProxy.scrollTo(item.id)
    }
}

不幸的是,这也存在同样的问题:在加载项目之前,滚动到给定项目不起作用。


问题:

有什么办法可以让这个工作,即触发一个NavigationLink对于当前在中不可见的项目LazyVGrid? (这对我来说很重要,因为我需要此功能来深层链接到特定项目的DetailView.)


一种可能的方法可以是这样的这个话题- 在 ScrollView 背景中的某处使用一个链接,并通过用户的点击手势/按钮或以编程方式分配相应的值来激活它。

使用 Xcode 13.4 / iOS 15.5 进行测试

enter image description here

主要部分:

ScrollView {
    LazyVGrid(columns: columns) {
        ForEach(items) { item in
            RoundedRectangle(cornerRadius: 16).fill(.yellow)
                .frame(maxWidth: .infinity).aspectRatio(1, contentMode: .fit)
                .overlay(Text("Item \(item.value)"))
                .onTapGesture {
                    selectedItem = item
                }
        }
    }
}
.padding(.horizontal)
.background(
    NavigationLink(destination: DetailView(item: selectedItem), isActive: isActive) {
        EmptyView()
    }
)
.toolbar {
    Button("Random") { selectedItem = items.randomElement() }
}

GitHub 上的测试模块

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 LazyVGrid 中以编程方式触发 NavigationLink 的相关文章

随机推荐

  • 厨师食谱中使用了哪些 ruby​​ 功能?

    我刚开始使用 Chef 对 ruby 不太了解 我无法理解食谱中使用的语言语法 比如说 我在食谱中的recipes default rb 中创建一个目录 如下所示 directory home test mydir do owner tes
  • 确定 C++ 应用程序是否作为 UWP 应用程序运行并具有旧版支持

    我的第一个想法是使用GetPackageFamilyName 并寻找ERROR SUCCESS vs APPMODEL ERROR NO PACKAGE 但是 我需要支持 Windows 7 这使得GetPackageFamilyName
  • jQuery validate - 如何防止自动提交?

    我热衷于使用 jQuery 验证器插件来验证我的代码 但我想禁用自动提交表单 我宁愿自己使用 jQuery 发送它 post method 事实上 考虑到我的按钮不是类型 我不太确定为什么要提交表单submit但只是
  • java进程间通信

    是否可以使用在命令行中运行java类来运行正在运行的swing中的某个类或函数 例如 当java Test asd将setText一个正在运行的swing Jlabel设置为asd 这两个程序在不同的进程中运行 您需要在进程之间创建一个接口
  • 在正则表达式中获取非法字符范围:java

    我有一个简单的正则表达式模式来验证名称 但是当我运行它时 我收到非法字符范围错误 我认为通过转义 s 它将允许一个空格 但编译器仍然抱怨 public boolean verifyName String name String namePa
  • PHP 支持 MVP 模式吗?

    有很多使用 ASP NET 解释 MVP 模式的示例 但没有找到任何使用 PHP 的示例 我是 PHP 程序员 想知道在哪里可以获得 MVP 模式 PHP 示例 简短的回答是 是的 PHP 可以 Note its not exactly M
  • 如何在 JavaScript 中换行?

    请告诉我如何在 JavaScript 中换行
  • 连接两个 Pandas DataFrame 同时保持索引顺序

    基本问题 我试图连接两个 DataFrame 生成的 DataFrame 按原始两个的顺序保留索引 例如 df pd DataFrame Houses 10 20 30 40 50 Cities 3 4 7 6 1 index 1 2 4
  • 升级到rails 3.1.0后ActionView::Template::Error(参数数量错误(1代表0))与atom_feed

    我刚刚将 Rails 应用程序从 3 0 7 版本升级到候选版本 3 1 0 我的 Atom feed 构建器中出现了一个奇怪的错误 ActionView Template Error wrong number of arguments 1
  • WPF/Metro 风格:使 ListView 只显示完整的项目

    在我的 Metro 应用程序中 我有一个包含一定数量项目 例如 25 个 的数据源 我有一个显示这些项目的 ListView 我的问题是 ListView 的大小允许它显示 6 5 个项目 因此它显示的最后一个项目被切成两半 如果分辨率改变
  • 如何在asp.net web应用程序中调用javascript方法

    我想在 C 函数中使用 javascript 函数 protected void button1 Click object sender EventArgs e javascript function call ex boolean b t
  • 为什么 JS 允许在数组中使用负索引?

    为什么 JS 中数组的负索引不会引发错误 看起来它不打算在数组中包含具有负索引的元素 array length不计算具有负索引的元素 array forEach 不会迭代具有负索引的元素 UPD 问题不是 为什么它在技术上是可能的 而是 为
  • Java 可选映射和 orElse 的链接(if-else-style)

    Java 中是否有一种优雅且流式的方式来表示 如果该值存在 则将此可选值映射到另一个带有计算值的可选值 否则返回一个空的可选值 我想到了类似的事情 Optional
  • 使用 USING 进行 SQL 连接:<列名称> 不是可识别的表提示选项

    我有以下加入 SELECT FROM tableA INNER JOIN tableB USING commonColumn 我收到错误 commonColumn 不是可识别的表提示选项 如果是 用作表值函数或 CHANGETABLE函数
  • Cayenne 3.1 - 动态设置数据源

    我目前使用 Cayenne 3 1B2 作为某些 Web 服务的持久层 服务需要公开多个数据库之一 所有数据库都具有相同的架构 在调用服务操作时确定数据库 使用哪个数据库的决定需要基于调用服务的客户端的身份 我将如何定义它并在运行时使用它
  • 暂时/动态禁用 Viewpager 中的单个页面

    我有一个扩展的 FragmentPagerAdapter 它为 ViewPager 提供 3 个片段 给我 3 个页面 我可以在它们之间滑动 也可以使用添加到操作栏的选项卡来手动选择页面 我想暂时禁止用户使用任一导航类型访问最终页面 禁用任
  • 用于设置系统蜂鸣声的批处理/VB 脚本

    我想知道 使用批处理 vbs 或任何其他内置的 Windows 语言 我可以让系统发出蜂鸣声 就像启动时按下某个键时发出的蜂鸣声 吗 我不确定这是否可能 但任何帮助都会很棒 这非常容易使用ctrl G 出现为 G在命令中 只需输入 Echo
  • 将 ImageView 与 EditText 水平对齐

    我正在努力寻找一种对齐的方法EditText and an ImageView properly在安卓上 我不断得到这个结果 XML 部分非常简单
  • 图像未在循环 Vue.js 中显示[重复]

    这个问题在这里已经有答案了 我正在尝试使用循环显示 9 个不同的图像v for 但是 他们没有表现出来 如果我在没有任何循环的情况下显示它 它就可以工作 我正在提取正确的资源 但它仍然不会显示 这是我的代码 img class list c
  • 如何在 LazyVGrid 中以编程方式触发 NavigationLink

    我有一个LazyVGrid里面一个NavigationView NavigationView ScrollView LazyVGrid columns columns ForEach items item in NavigationLink