首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI:导航在包含节的列表中不能正常工作

基础概念

SwiftUI 是苹果推出的一个声明式 UI 框架,用于构建 macOS、iOS、watchOS 和 tvOS 应用程序。它允许开发者通过描述 UI 的外观和行为来构建界面,而不是通过编写大量的代码。

在 SwiftUI 中,导航是通过 NavigationViewNavigationLink 来实现的。NavigationView 提供了一个容器,可以在其中嵌套多个视图,并通过 NavigationLink 来实现视图之间的导航。

问题描述

在包含节的列表(例如 List 中嵌套 Section)中,导航可能无法正常工作。这通常是由于 NavigationLink 的使用不当或布局问题导致的。

原因

  1. NavigationLink 的使用不当NavigationLink 必须直接嵌套在 ListSection 内部,而不是嵌套在其他视图中。
  2. 布局问题:如果 NavigationLink 被包裹在其他视图中,可能会导致其无法正确识别点击事件。

解决方法

以下是一个示例代码,展示了如何在包含节的列表中正确使用 NavigationLink

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                Section(header: Text("Section 1")) {
                    NavigationLink(destination: DetailView(text: "Detail 1")) {
                        Text("Item 1")
                    }
                    NavigationLink(destination: DetailView(text: "Detail 2")) {
                        Text("Item 2")
                    }
                }
                
                Section(header: Text("Section 2")) {
                    NavigationLink(destination: DetailView(text: "Detail 3")) {
                        Text("Item 3")
                    }
                    NavigationLink(destination: DetailView(text: "Detail 4")) {
                        Text("Item 4")
                    }
                }
            }
            .listStyle(InsetGroupedListStyle())
            .navigationTitle("Navigation Demo")
        }
    }
}

struct DetailView: View {
    let text: String
    
    var body: some View {
        Text(text)
            .padding()
            .navigationTitle("Detail")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

解释

  1. NavigationView:作为最外层的容器,提供导航功能。
  2. List:用于显示列表数据。
  3. Section:用于将列表项分组,并提供标题。
  4. NavigationLink:用于实现视图之间的导航。destination 参数指定了目标视图,而 NavigationLink 的内容则是显示在列表中的文本。

应用场景

这种导航方式适用于需要在列表中展示多个分组,并且每个分组中的项可以导航到详细视图的场景。例如,一个包含多个类别的应用程序,每个类别下有多个项目,点击项目可以查看详细信息。

参考链接

通过以上方法,你应该能够在包含节的列表中实现正常的导航功能。如果仍然遇到问题,请检查 NavigationLink 的嵌套位置和布局,确保其直接嵌套在 ListSection 内部。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在 SwiftUI 中创建自适应的程序化导航方案

因此在 SwiftUI 中,掌握两种导航容器的状态表述差异是实现自适应导航方案的关键。...在栈中推送和弹出数据的过程对应了导航容器中添加和移除视图的操作。弹出全部数据相当于返回根视图,推送多个数据相当于一次性添加多个视图并直接跳转到最后数据所代表的视图。...以导航容器的出现时机( onAppear )作为重新构建状态的起始点sizeClass 在变化的过程中,其中的值可能会出现重复变化的情况。...本着“一案一议”的原则,当前方案可以实现对任意的导航逻辑进行转换。总结可以在 此处[5] 获取本文的全部代码。一次编写便可对应多种设备,这本就是 SwiftUI 的一个重要特点。...每周也会对当周博客上的新文章以及在 Twitter 上发布的 Tips 进行汇总,并通过邮件列表的形式发送给订阅者。订阅下方的 邮件列表[8],可以及时获得每周的 Tips 汇总。

4.3K30

Ask Apple 2022 与 SwiftUI 有关的问答(上)

是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...可以试着把 init 中的工作转移到 UITabBarController 的 viewDidLoad 中。...在常规宽度下,我们在详细视图中有一个带有导航堆栈的侧边栏。在紧凑宽度下,我们有一个标签栏,每个标签都有一个导航堆栈。...A:目前最好的方法是建立一个导航状态模型对象,它持有导航状态的规范表示,它可以为你的正常和紧凑显示提供专门的程序绑定。...不是因为它不能工作,而是因为如果你不深入了解 @State 和身份( identity )的工作原理,它的行为就会相当混乱。

12.3K20
  • Excel实战技巧55: 在包含重复值的列表中查找指定数据最后出现的数据

    文章详情:excelperfect 本文的题目比较拗口,用一个示例来说明,如下图1所示,是一个记录员工值班日期的表,在安排每天的值班时,需要查看员工最近一次值班的日期,以免值班时间隔得太近。...A2:A10中的值,如果相同返回TRUE,不相同则返回FALSE,得到一个由TRUE和FALSE组成的数组,然后与A2:A10所在的行号组成的数组相乘,得到一个由行号和0组成的数组,MAX函数获取这个数组的最大值...,也就是与单元格D2中的值相同的数据在A2:A10中的最后一个位置,减去1是因为查找的是B2:B10中的值,是从第2行开始的,得到要查找的值在B2:B10中的位置,然后INDEX函数获取相应的值。...组成的数组,由于这个数组中找不到2,LOOKUP函数在数组中一直查找,直至最后一个比2小的最大值,也就是数组中的最后一个1,返回B2:B10中对应的值,也就是要查找的数据在列表中最后的值。...= .Cells(i, ColNum) Exit Function End If Next i End With End Function 然后,在工作表中像

    10.9K20

    架构之路 (五) —— VIPER架构模式(一)

    在Entities组中,您将看到与数据模型相关的类。Trip和Waypoint稍后将作为VIPER架构的Entities。因此,它们只保存数据,不包含任何功能逻辑。...路由器Router处理屏幕之间的导航。这与SwiftUI不同,在SwiftUI中,视图显示任何新视图。...在本例中,主要的entity是Trip,它包含一个路点Waypoints列表,路点是旅程中的各个站点。 这个应用程序包含一个DataModel类,它包含一个旅行列表。...由于演示者presenter的工作是用数据填充视图,所以您希望从数据模型中公开旅程trips列表。...当您将其放置在NavigationView中时,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。

    17.6K10

    echarts图表在Tab页中width: 100%失效导致的第一个Tab页之后的Tab页图表不能正常显示的问题

    解决Tab切换echarts图表不能正常显示问题: // 绘图div父容器的宽度 let w = $('.figure').width(); $('#fig-t').css('width...', w); // 获取父容器的宽度直接赋值给图表以达到宽度100%的效果 $('#fig-f').css('width', w); // 获取父容器的宽度直接赋值给图表以达到宽度100%的效果..., 由于是在图表初始化的时候设置了容器宽度,图表并不能随窗口缩放自适应,下面是解决方法: window.onresize = function () { // 绘图div父容器的宽度 let...').css('width', w); // 获取父容器的宽度直接赋值给图表以达到宽度100%的效果 $('#fig-e').css('width', w); // 获取父容器的宽度直接赋值给图表以达到宽度...100%的效果 if ((typeof fig_t) !

    2.4K20

    苹果全新UI框架来了!可视化编程,自动化减少20%代码量

    Swift是苹果最新的开发语言,有人呼吁谷歌取代TensorFlow的Python。目前在TOIBE排名18位: ? 在RedMond排名11 ?...而SwiftUI通过4种方式,解决了上述问题: 用一个新的声明式UI结构,定义了的布局的外观和工作方式 更新UI预览会自动生成新的Swift代码,反之,更改Swift代码也会更新UI预览 Swift中的任何绑定例如有效的...感受一下SwiftUI的代码风格 ? Github一个repo整理了在WWDC 2019发布的SwiftUI布局框架的一些官方示例: SwiftUI Essentials 创建和组合视图: ?...创建列表和导航栏: ? 处理用户输入: ? Drawing and Animation 绘图路径和形状: ? 动画视图和过渡 ? App Design and Layout 复杂界面组合: ?...比如,它只支持Swift,你不能在Obj-C里使用SwiftUI;SwiftUI目前还不是很成熟,正在从事iOS开发的程序员可能更应该继续使用Obj-C,直到SwiftUI足够成熟。

    5.4K20

    解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

    原文发表在我的博客 肘子的Swift记事本视图变化在前、状态变化在后在 SwiftUI 中,某些可编程控件在执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一个在 SwiftUI 所有版本中存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...它的复现条件如下:iOS 16 系统,在真机或模拟器上测试点击视图列表中的按钮,可以进入下一级视图。...在我们遇到问题的两个场景中,应用程序都恰好使用了导航容器,并且通过特定的操作,使 RunLoop 处于了适合 AG 打包更新的状态。...随着版本的提高,SwiftUI 的功能也确实得到了相当程度的增加。不过,即使在最新的版本中,在一些对 UIKit(AppKit)进行二次包装的控件中,仍有不少细节处理不到位的问题。

    760110

    AnyView 对 SwiftUI 性能的影响

    前言AnyView 是一种类型擦除的视图,对于 SwiftUI 容器中包含的异构视图非常方便。在这些情况下,你不需要指定视图层次结构中所有视图的具体类型。...在这个测试中,我们将通过整个消息列表三次滚动。没有 AnyView下面是没有泛型实现的动画卡顿记录。...为了更好地理解结果,我们需要深入了解 SwiftUI 的工作原理。在这个关于 SwiftUI 性能的 WWDC 会话中,来自 SwiftUI 团队的 Raj 讨论了列表或表需要提前知道所有标识符。...总结总而言之,在这些情景中(包含异构视图的可滚动列表),最好为容器中的不同视图使用具体类型。这可能听起来更复杂一些,但实际上你可以使其更简单,而不必过多地处理泛型。...例如,如果你有一个菜单,作为几个异构元素的列表,在点击时显示不同的导航目标,并且决定将这些视图包装为 AnyView,我的测量结果表明与使用其他方法相比,性能没有区别。

    15300

    用 Flutter 搭建标签+导航框架

    前言 ---- 在 Flutter 这个分类的第一篇文章总结了下最新的 Mac 搭建 Flutter 开发环境和对声明式UI这个理解的东西,前面也有提过,准备像在 SwiftUI 分类中那样花一些功夫来写一个...模式还是按照 SwiftUI 的,我们写一个标签+导航的模式,具体的Demo 效果如下所示,我们在看几个比较具体的概念性东西。 ?...Widget 是 Flutter 功能的抽象描述,也就是一切皆为 Widget(这点反应在SwiftUI 中我觉得和 View 的性质有点像)。...Widget, 它提供了默认的导航栏、标题和包含主屏幕 Widget 的body属性。...在我们的Demo中,我们是直接在push方法里面写了具体的页面的内容的在,这个正常肯定是另一个 Widget 的,相信应该明白的,我们看我们具体的代码: // 跳转方法 void _pushSaved(

    1.3K10

    解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

    但是,SwiftUI 中的一些系统控件并没有完全遵循响应式的设计原则,由此在某些情况下会出现严重的错误,影响用户体验,并使开发者无所适从。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死 这是一个在 SwiftUI 所有版本中存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...它的复现条件如下: iOS 16 系统,在真机或模拟器上测试 点击视图列表中的按钮,可以进入下一级视图。...在我们遇到问题的两个场景中,应用程序都恰好使用了导航容器,并且通过特定的操作,使 RunLoop 处于了适合 AG 打包更新的状态。...随着版本的提高,SwiftUI 的功能也确实得到了相当程度的增加。不过,即使在最新的版本中,在一些对 UIKit(AppKit)进行二次包装的控件中,仍有不少细节处理不到位的问题。

    37020

    解析SwiftUI布局细节(三)地图的基本操作

    (点击地图位置会获取经纬度,反地理编译得到具体的位置信息,显示在列表中) SwiftUI怎样使用UIKit的控件 ---- 我们来总结一下,SwiftUI怎么使用UIKit的控件,中间的连接就是...首先有一点,在SwiftUI中我们创建的View都是Struct类型,但手势的事件是#selector(),本质上还是OC的东西,所以在事件前面都是带有@Obic的修饰符的,但你要是Struct类型肯定是行不通的...网络请求到的数据我们怎样刷新页面(模拟) ---- 关于刷新数据这个是比较简单的,用到的就是我们前面提的绑定数据的模式,这点真和Rx挺像的,你创建了一个列表,然后给列表绑定了一个数组数据源,...在前面第一小节我们提到了地图获取到点击的经纬度之后怎样更新地图上面的信息,其实用的也是这点,绑定数据刷新!...,回到给你的就是一个元素是 CLLocation 类型的数组,我们在Demo中只取了First,你拿到的是经纬度,你要想获取这个经纬度的具体位置信息就得经过反地理编码,拿到某某市区某某街道某某位置的信息

    2.1K10

    Xcode 11 初体验

    趁着最新更新正是版本的 Xcode 11 于是就有这一篇 Xcode 11 初体验 Xcode工作流的改进(Workflows) 工程创建 创建工程进来,就会发现 User Interface 可以进行选择...将 Assistant、和 Vesion Editor下的Autor 选项卡合并为一项,并从主导航中移除,向下移到每个编辑面板中,组成 Editor Option。...主导航中只保留Code Review功能。 新增Add Editor、MiniMap。 我们这里着重介绍一下 Editor Options 、Add Editor、MiniMap 这3个选项。...指定文件打开位置 上面我们介绍了窗口分割,在 Xcode 11 中,你还可以按住 Option + Shift,然后在左边点击要打开的文件,这时会出现窗口选择提示 你可以用键盘,或者鼠标任意方式选择你要打开这个文件的窗口...在Git Tab页面,会展示出当前本地 Branches 列表、Stash Changes 列表、Tags 列表、Remotes 远程仓库列表。

    3.2K10

    SwiftUI 4.0 的全新导航系统

    访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验。欢迎大家在 Discord 频道[2] 中进行更多地交流 长久以来,开发者对 SwiftUI 的导航系统颇有微词。...⚠️ 在使用堆栈管理系统的情况下,请不要在编程式导航中混用声明式导航,这样会破坏当前的视图堆栈数据 下面的代码,如果点击声明式导航,将导致堆栈数据重置。...最大的区别是,SwiftUI 4.0 为我们提供了在 NavigationSplitView 中通过 List 快速绑定数据的能力。...增强 SwiftUI 的导航视图[4] 一文中的实现方法 其他增强 除了上述的功能, 新的导航系统还在很多其他的地方也进行了增强。...定制 NavigationLink 样式 在之前版本的 SwiftUI 中,NavigationLink 其实一直都是作为一种特殊的 Button 存在的。

    10.4K62

    肘子的 Swift 周报 #060|Older or Outer?我开始怀念非智能时代

    这是我 18 年前安装的众多智能开关中最后一个尚能正常工作的,它的“退役”,标志着传统智能设备在我生活中的全面落幕。 18 年前,“智能家电”还只是一个模糊的概念,智能开关也没有统一标准可言。...SwiftUI 多层导航中的 onChange 异常[3] Fatbobman(东坡肘子)[4] SwiftUI 提供的onChange修饰器,使开发者能够在视图中监听特定值的变化,并在值发生改变时执行相应的操作...★EmergeTools 在构建 SnapshotPreviews[9]时使用了该技巧,成功调用了 SwiftUI 框架中未公开的将预览渲染为图片的功能。...Wesley Matlock 在本文中分享了一系列实用的调试技巧,帮助开发者快速定位和解决 SwiftUI 布局中的常见问题。...SwiftUI 多层导航中的 onChange 异常:https://t.ly/hwnGJ [4] Fatbobman(东坡肘子):https://x.com/fatbobman [5] 在 Mac Catalyst

    5210

    SwiftUI TextField进阶——格式与校验

    在为SwiftUI增加新功能时,要求自己尽量遵守以下原则: •优先考虑能否在SwiftUI原生方法中找到解决手段•如确需采用非原生方法,尽量采用非破坏性的实现,新增功能不能以牺牲原有功能为代价(需兼容官方的...SwiftUI修饰方法) 以上原则,在SheetKit——SwiftUI模态视图扩展库[3]和用NavigationViewKit增强SwiftUI的导航视图[4]中均有体现。...,尽管我们可以设置最终格式化的样式,但是TextField并不能在文字录入过程中对文本进行格式化显示。...不过除非SwiftUI对背后的实现逻辑进行了较大修改,否则方案一在最近几个版本中仍会正常运行,而且方案一可以支持更早版本的SwiftUI。...本文仅涉及了TextField的部分内容,在【SwiftUI TextField进阶】的其他篇幅中,我们将探讨更多的技巧和思路,让开发者在SwiftUI中创建不一样的文本录入体验。

    8.2K20

    SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

    但是我们也可以将自定义对象发送到环境中,并在以后将它们读出来,这使我们可以在复杂的应用程序中更轻松地共享数据。...这意味着,如果视图A是导航视图,则所有压入导航堆栈的视图都可以访问同一环境。但是,如果视图A以工作表(sheet)的形式显示视图B,则它们不会自动共享环境数据,因此我们需要手动发送。...Apple已将此工作表情况描述为他们想要修复的错误,因此我希望在以后对SwiftUI的更新中会有所改变。...在向您展示一些代码之前,还有最后一件事:环境对象使用您已经学过的ObservableObject协议,SwiftUI将自动确保共享同一环境对象的所有视图在更改时都会更新。...).environmentObject(user) DisplayView().environmentObject(user) } } } 这就是使我们的代码正常工作所要做的一切

    9.7K20

    用NavigationViewKit增强SwiftUI的导航视图

    用NavigationViewKit增强SwiftUI的导航视图 如果想获得更好的阅读体验,请访问我的博客 www.fatbobman.com[1] 最近一直在为我的iOS健康管理app健康笔记3.0[...2]做前期的准备工作。...由于SwiftUI原生提供的导航手段能力有限,因此在之前的版本中,NavigationView总是使用的不是那么的顺手。...该扩展遵循以下几个原则: •非破坏性任何新添加的功能都不能影响当前SwiftUI提供的原生功能,尤其是不能影响例如Toolbar、NavigationLink在NavigationView中的表现•尽可能便于使用仅需极少的代码便可使用新增功能...app中主要的用途是处理Deep Link,绝大多数的时间都不是在视图代码中调用的。

    3.3K20

    自定义 SwiftUI 中符号图像的外观

    foregroundStyle(.indigo)}.symbolRenderingMode(.hierarchical)symbolRenderingMode() 修饰符既可以直接应用于图像视图,也可以通过将其应用于包含多个符号图像的父视图来在环境中设置...在 SwiftUI 中,我们可以使用 symbolVariant() 修饰符来应用这些变体。...轮廓变体在工具栏、导航栏和列表中非常有效,而填充变体则用于强调选择的状态。...轮廓变体在工具栏、导航栏和列表中非常有效,因为这些地方通常会与文本一起显示符号。将符号封装在圆形或方形等形状中可以增强其可读性,特别是在较小尺寸下。...将上述代码粘贴到 ContentView.swift 文件中。运行项目,查看效果。结论在SwiftUI中增强符号图像可以显著改善应用程序的外观和感觉。

    12610
    领券