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

SwiftUI 4.0 的全新导航系统

NavigationLink 仍需设定目标视图,会造成不必要的实例创建开销 较难实现从视图外调用导航功能 “能用,但不好用” 可能就是对老版本编程式导航比较贴切地总结。...", destination: SubView1(), tag: Target.subView1, selection: $selectedTarget) // SwiftUI 在进入当前视图,无论是否进入目标视图...中指定目标视图,因此无须创建多余的视图实例 对由同一类型的值驱动的目标进行统一管理( 可以将堆栈中所有视图NavigationLink 处理程序统一到根视图中 ),有利于复杂的逻辑判断,也方便剥离代码...navigationBar) } RocketSim_Screenshot_iPhone_13_Pro_Max_2022-06-12_09.12.01 NavigationStack 的 toolbar 背景色只有在视图上滚才会显示...browser 在 iPad 下,当前视图的 Title 将显示在左侧 image-20220612190914949 editor 不显示返回按钮旁边的上页视图 Title image-20220612191040190

10.3K62

用NavigationViewKit增强SwiftUI的导航视图

有以下几个我不满意的地方: •缺少直接返回视图的便捷手段•无法通过代码(不通过NavigationLink)跳转到新视图•双栏模式(DoubleColumnNavigationViewStyle)下显示风格不统一...此种手段将限制NavigationLink的种类选择,另外不利于视图代码中实现。...NavigationView的注册Tag,animated设置返回视图是否显示转场动画,action进一步的善后代码段。...的注册Tag,animation设置是否显示转场动画,view视图。...视图中支持SwiftUI原生的所有定义,例如toolbar、navigationTitle等。 目前在启用转场动画,title和toolbar会在转场动画后才显示,观感稍有不足。日后尝试解决。

3.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。..., NavigationStack 添加一个屏蔽手势的前景视图,以确保用户只能在 showSheet 通过滑动返回到上一层视图。...当视图正在滚动返回上一层视图会导致应用崩溃这是一个由 xiaogd 在我的 Discord 论坛中提出的 问题。...幸运的是,我 @KyleSwifter 的 解密 SwiftUI 背后的 AttributeGraph 一文中找到了线索。...由于在返回上层视图,状态尚未更新,因此在清理 AG 返回动画运行中),会破坏应用程序的 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

    707110

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

    众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...(动画结束),立即在屏幕上由左至右滑动,返回上一层视图 在滑动返回到上一层视图后,应用会锁死。..., NavigationStack 添加一个屏蔽手势的前景视图,以确保用户只能在 showSheet 通过滑动返回到上一层视图。...幸运的是,我 @KyleSwifter[4] 的 解密 SwiftUI 背后的 AttributeGraph[5] 一文中找到了线索。...由于在返回上层视图,状态尚未更新,因此在清理 AG 返回动画运行中),会破坏应用程序的 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

    34620

    如何让 SwiftUI 的列表变得更加灵活

    前言 List 可能是 SwiftUI 附带的内置视图中最常用的一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图”的用户界面。...由于每个 article 值在 ForEach 闭包中都是可变的,我们可以使用新的 swipeActions 修饰符来实现每个 NavigationLink 项目视图的自定义滑动操作。...由于系统会自动检测知道 viewModel.reload() 何时调用完成,因此可以防止发生重复的刷新操作,并且可以更具状态显示和隐藏相应 UI。...,可以根据想要构建的 UI 类型动态隐藏或显示每个分隔符。...总结 SwiftUI 正在变得更加灵活和强大,后面我将继续探索更多新推出的 API,并在这里发布分享,欢迎持续关注,为了防止丢失,建议本号设置星标。

    4.9K41

    解析SwiftUI布局细节(二)循环轮播+复杂布局

    这篇我们还是说我们关于SwiftUI的东西,再提一下Demo代码我已经提交上Git了,目前Demo进度一级页面基本上结束,地图点击大头针的添加也刚处理完,代码有需要的小伙伴可以去Git看看,项目地址...通过它我们可以避免在初始 View 创建 ObservableObject, 而是环境中获取 ObservableObject,像 @EnvironmentObject,@ObservedObject...GeometryReader 的主要作用就是能够获取到父View建议的尺寸,这就是它的主要作用,要没有它我们面临的可能就是无休止的传值了,SwiftUI 既然是声明式的UI,按我的理解你就没有办法去获取某一个视图的父视图之类的...有一个还得说明一下,GeometryReader 改变了它显示内容的方式。在 iOS 13.5 中,内容放置方式 .center。在 iOS 14.0 中则为:.topLeading。...3、再提一点关于上面说的滚动视图,在UIKit中我们可以用UICollectionView搞定一切,但是在SwiftUI中没有这个控件,我建议采用的方式是 ScrollView + HStack + VStack

    12.1K20

    @StateObject 研究

    SwiftUI 1.0代,如果想将引用类型作为source of truth,通常的方法是使用@EnvironmentObject或者 @ObservedObject。...无论是@StateObject或是@ObservedObject其都表现出一致的状态,两个View都可以正常的显示当前按钮的点击次数,不过当点击刷新按钮,CountViewState中的数值仍然正常,...调试信息可以看出,当点击刷新,CountViewObserved中的实例被重新创建了,并销毁了之前的实例(CountViewObserved视图并没有被重新创建,仅是重新求了body的值)。...: CountViewObserved()) } } }} 测试2中,点击link进入对应的View后通过点击+1进行计数,然后返回视图。...当再次进入link后,@StateObject对应的视图中计数清零(由于返回视图,再次进入时会重新创建视图,所以会重新创建实例),不过@ObservedObject对应的视图中计数是不清零的。

    1.2K40

    SwiftUI搭建项目说起

    SwiftUI 谈声明式 UI 与类型系统 跨平台: 在最新的swiftUI 5.1中,我们创建一个MultilPlatform App有了下面这些区别: ·Before func...将整个原有的苹果平台差异部分抽象 App 和 Scene 部分,可以看到Swift5.1之后在完全无需引入UIKit 的情况下我们就创建了一个多平台的App工程,代码也原本的基于 UI/NS HostViewController...,它是用来控制View之间的跳转的: destination:是跳转的目标View,我们在做一些数据传递的时候一般都是在这里说明的。...简单看看Na+Tb的代码 ---- SceneDelegate开始, 根控制器就是 UIHostingController,我们需要做的第一步就是设置它的根视图 rootView //...下面的参考文章相信能帮助我们更好的理解一下,SwiftUI! 参考文章: Apple SwiftUI SwiftUI 谈声明式 UI 与类型系统 如何评价 SwiftUI? 项目地址

    4.5K20

    优化在 SwiftUI List 中显示大数据集的响应效率

    列表视图的初始化和 body 求值 如果对 SwiftUI 的 NavigationView 有一定了解的话,应该知道 SwiftUI 会对 NavigationLink目标视图进行预实例化(但不会对...也就是当显示主界面菜单,列表视图已经完成了实例的创建(可以通过在 ListEachRowHasID 的构造函数中添加打印命令得以证明),因此也不应是实例化列表视图导致的延迟。...在 SwiftUI 视图的生命周期研究[3] 一文中,我对 List 如何对子视图显示进行优化做了一定的介绍。...当仅通过 ForEach 来指定显示标识,List 会对这些视图显示进行优化,仅在需要显示才会对其进行实例化。...解决方案一 iOS 15 开始,SwiftUI List 添加了更多的定制选项,尤其是解除了对列表行分割线设置的屏蔽且添加了官方的实现。

    9.2K20

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

    Ask Apple 开发者与苹果工程师创造了在 WWDC 之外进行直接交流的机会。本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文下篇。...阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建底部开始的滚动视图Q:我如何实现一个在底部对齐的滚动视图,在 macOS 上会不会有糟糕的性能?...navigationDestination,这样侧边栏里的 NavigationLink 就会取代详细栏的根视图。...另外,可以考虑原始图片创建缩略图,进一步提高显示的效率。...但这个滚动有两大问题,1、是一个未公开的半成品,有可能会被 SwiftUI 框架中移除;2、不支持懒加载,即使和 Lazy 视图一起使用也会一次性加载全部的视图

    14.8K30

    SwiftUI-数据流

    数据处理的基本原则 Data Access as a Dependency:在 SwiftUI 中数据一旦被使用就会成为视图的依赖,也就是说当数据发生变化了,视图展示也会跟随变化,不会像 MVC 模式下那样要不停的同步数据和视图之间的状态变化... @State 中获取数据应用,并保持同步。...数据流图 从上图可以看出SwiftUI 的数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态的改变 数据状态的变化会触发视图重绘 SwiftUI 内部按需更新视图,...最终再次呈现给用户,等待下次界面操作 注意 在 SwiftUI 中,开发者只需要构建一个视图可依赖的数据源,保持数据的单向有序流转即可,其他数据和视图的状态同步问题 SwiftUI 帮你管理,所以 ViewController...,这种视图的拼装方式大大提高了界面开发的灵活性和复用性,视图组件化并任意组合的方式是 SwiftUI 官方非常鼓励的做法。

    10.2K20

    SwiftUI 视图的生命周期研究

    •在 SwiftUI 生成视图值树,当发现没有对应的实例SwiftUI 会创建一个实例从而获取它的 body 结果。...但 SwiftUI 并非一定会从新的实例中获取 body 结果,如果之前的实例注册过数据依赖,视图值树仍可能会原来的实例的 body 中获取结果。...•在 NavigationView 中,如果在 NavigationLink 中使用了静态的目标视图SwiftUI 将会为所有的目标视图创建实例,无论是否访问。...,将完成依赖项的建立工作•在视图的生命周期中,只有一个依赖项副本•在视图的生命周期中,无论创建多少个实例,同一间只有一个实例可以连接到依赖项•依赖项视图的 Source of truth 了解 SwiftUI...视图的生命周期的意义 SwiftUI 试图淡化视图生命周期的概念,在大多数场景下确实实现了它的设计目标

    4.4K30

    老人新兵 —— 一款 iOS APP 的开发手记

    最大的一个是如果 view 的内容比较复杂,且 barItem 使用中文或图片,缓慢地左侧滑动页面返回,会出现不同 View 顶部的 NavigationBarItem 重叠的现象,导致 BarItem...模拟器中 NavigationLink 只能使用一次,第二次点会失效,实机没有问题。很难实现直接返回到根视图,通过 dissmiss 只能返回到上层视图。...导致我无法很好地实现双击 TabView 图标返回该 Tab 的根视图,比较郁闷。...当一个 view 中有基于 ForEach 动态变化的数据,如果该 view 在 sheet 中,数据变化后会导致触发异常,如果将 view Sheet 中提取出来直接显示则无此问题。...我的 app 中有几处 Sheet 弹出的响应就比较慢( 将 view 移出 sheet,使用 NavigationLink 调用显示就很好 ),尤其是退出的响应更慢。

    2.5K40

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

    4.0 版本开始,苹果对之前 SwiftUI 有限的程序化导航能力进行了大幅度的增强,通过引入 NavigationStack 和 NavigationSplitView,开发者基本上具备了全程掌握应用的导航状态的能力...在栈中推送和弹出数据的过程对应了导航容器中添加和移除视图的操作。弹出全部数据相当于返回视图,推送多个数据相当于一次性添加多个视图并直接跳转到最后数据所代表的视图。...horizontalSizeClass 判断标准InterfaceSizeClass 对应的是当前视图的视觉大小。...最好以导航容器所在视图的 sizeClass 作为判断标准。例如,在 Side 列视图中,无论在任何环境下,horizontalSizeClass 始终 compact 。...不要忘记 NavigationStack 的根视图不在它的“栈”数据中在本例中,转换至 NavigationStack ,需要将 Detail 列中声明的视图添加到“栈”的底端。反过来则将其移除。

    4.3K30

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

    是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或列表中选择一个选项 )?...另外,按照这种方法,@FocusState 变量会变得没有反应,而且它不能被设置 nil( 返回到以前的视图并没有移除键盘 )。是否可以在纯 SwiftUI 中完成( 不使用 UIKit )?...在我的例子中,不拖动 0 到 75,拖动 0 到 100。有什么办法可以阻止这种情况吗?A:你可以用 .chartYScale(domain: 0 ... 75) 锁定 Y 轴的刻度域。...通用导航模型Q:我们正在使用带有路径参数的 NavigationStack,但当用户在 stage manager 中把窗口的大小 Regular 调整 Compact ,我们在 “转换” 路径方面遇到了麻烦...在有些情况下,我想根据视图是否折叠来做决定( 例如,如果展开,在详细视图显示一条信息,如果折叠,则显示一个警告或其他指示 )。

    12.3K20
    领券