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

SwiftUI 4.0 的全新导航系统

仍需设定目标视图,会造成不必要的实例创建开销 较难实现从视图外调用导航功能 “能用,但不好用” 可能就是对老版本编程式导航比较贴切地总结。...", destination: SubView1(), tag: Target.subView1, selection: $selectedTarget) // SwiftUI 在进入当前视图,无论是否进入目标视图...4.0 之前的版本上使用类似的功能,可以参考在 用 NavigationViewKit 增强 SwiftUI导航视图[4] 一文中的实现方法 其他增强 除了上述的功能, 新的导航系统还在很多其他的地方也进行了增强...相当一部分开发者由于版本适配的原因并不会使用新的 API ,因此,每个人都需要认真考虑如下问题: 如何从新 API 中获得灵感 如何在老版本中运用编程式导航思想 如何让新老版本的程序都能享受系统提供的便利...另一方面,新导航系统也向每一个开发者传递了明确的信号,苹果希望应用能够为 iPad 和 macOS 提供更加符合各自设备特点的 UI 界面。

10.3K62

用NavigationViewKit增强SwiftUI导航视图

用NavigationViewKit增强SwiftUI导航视图 如果想获得更好的阅读体验,请访问我的博客 www.fatbobman.com[1] 最近一直在为的iOS健康管理app健康笔记3.0[...由于SwiftUI原生提供的导航手段能力有限,因此在之前的版本中,NavigationView总是使用的不是那么的顺手。...•在iPad下,无法在竖屏(Portrait)模式下保持双栏状态 因此,在这次开发的准备阶段,写了一个针对NavigationView的扩展库——NavigationViewKit[3]。...NavigationViewManager是NavigationViewKit中提供的导航视图管理,它提供如下功能: •可以管理应用程序中全部的NavigationView•支持从NavigationView...竖屏,左侧栏默认会隐藏,容易让新用户无所适从。 TipOnceDoubleColumnNavigationViewStyle会在iPad首次进入竖屏状态,将左侧栏显示在右侧栏上方,提醒使用者。

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

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

众所周知,SwiftUI一个响应式框架,这意味着,数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...原文发表在的博客 肘子的Swift记事本视图变化在前、状态变化在后在 SwiftUI 中,某些可编程控件在执行一定的操作,会先更新视图,待视图变化完成后再修改与其对应的状态。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一个SwiftUI 所有版本中存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...视图正在滚动返回上一层视图会导致应用崩溃这是一个由 xiaogd 在的 Discord 论坛中提出的 问题。...状态更新滞后不仅存在于本文介绍的两个案例中,开发者遇到类似情况,可以尝试采用状态更新优先的开发策略进行修改。总结今年 SwiftUI 已经进入了第五个年头。

614110

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

众所周知,SwiftUI一个响应式框架,这意味着,数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...这两个错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及在滚动中返回上层视图导致应用崩溃。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死 这是一个SwiftUI 所有版本中存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...视图正在滚动返回上一层视图会导致应用崩溃 这是一个由 xiaogd 在的 Discord 论坛中提出的 问题[3]。...状态更新滞后不仅存在于本文介绍的两个案例中,开发者遇到类似情况,可以尝试采用状态更新优先的开发策略进行修改。 总结 今年 SwiftUI 已经进入了第五个年头。

29520

从用SwiftUI搭建项目说起

这两张图相信看过苹果官方SwiftUI介绍文档并且跟着写了一遍代码的同学应该不陌生,当然我们的目的不是说这两篇的代码,这个具体的可以下面连接去查看,自己跟着写了一遍之后对SwiftUI也是有了一个基本的认识...Apple SwiftUI SwiftUI ---- 在进入项目搭建先说说自己对SwiftUI一个基本的认知: SwiftUI觉得对iOSer来说最大的是开发UI模式的优化...在UIKit中我们的导航、标签都是通过控制来管理,但是在SwiftUI中他们分别是通过NavigationView+TabView管理的,我们得在认识上有一个基本的转变,从ControllerView...SwiftUI 将会把使用过 @State 修饰的属性存储一个特殊的内存区域,并且这个区域和 View struct 是隔离的....下面的参考文章相信能帮助我们更好的理解一下,SwiftUI! 参考文章: Apple SwiftUISwiftUI 谈声明式 UI 与类型系统 如何评价 SwiftUI? 项目地址

4.4K20

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

是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...只有将这些变量重构视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构中或许是好的选择。...最近,注意 SwiftUI 视图的 onAppear 在意想不到的时间启动,比如 UITabBarController 被创建,而不是视图本身出现时。...WindowGroup 和 OpenWindowActionQ:在 macOS 上是否可以在创建新窗口附加参数?同一个子上下文中创建一个新的托管对象,并希望将这个对象发送到一个新的窗口。...那么在 SwiftUI 中使 if 语句是否有什么注意事项?A:关于 if/else 需要注意的是,它们如何影响视图的身份,我们在 WWDC 上有一个很好的 演讲[21]。

12.2K20

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

开始 首先看下主要内容: 在本教程中,您将了解如何SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...路由Router处理屏幕之间的导航。这与SwiftUI不同,在SwiftUI中,视图显示任何新视图。...您查看图表,您可以看到数据在视图view和实体entities之间流动的完整路径。 SwiftUI有自己独特的做事方式。...将用户操作发送回数据模型,VIPER模式甚至更有用。 为此,您将添加一个按钮来创建一个新的旅程。...您将其放置在NavigationView中,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。

17.4K10

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

与 UIKit 使用的命令式导航方式不同,SwiftUI 作为一个声明式框架,感知与设置两者之间是二位一体的关系。读取状态即可获知当前的导航位置,更改状态便可调整导航路径。...开发者需要自行对两种导航逻辑的状态进行转换。方案三将演示如何进行这一过程。...不过我们可以通过使用另一个 navigationDestination(isPresented:) 修饰来达到类似的目的。...本着“一案一议”的原则,当前方案可以实现对任意的导航逻辑进行转换。总结可以在 此处[5] 获取本文的全部代码。一次编写便可对应多种设备,这本就是 SwiftUI一个重要特点。...正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性的问题和技巧制作成 Tips ,发布在 Twitter 上。

4.2K30

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

Table 中上下文菜单Q:如果在 TABLE 上添加了一个上下文菜单,如何确定哪一行导致了菜单的显示(无需选择该行)?...阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建从底部开始的滚动视图Q:如何实现一个在底部对齐的滚动视图,在 macOS 上会不会有糟糕的性能?...将背景扩展安全区域Q:如果一个自定义的容器类型,可以接受一个顶部和底部的视图,是否有办法让 API 的调用者将所提供的视图的背景扩展安全区域内,同时将内容( 如文本或按钮 )保留在安全区域内?...连锁动画Q:在 SwiftUI 中,如何实现连锁动画?例如,想先给一个视图做动画,动画完成后立即启动另一个动画。A:不幸的是,目前不可能实现连锁动画。...A:解决办法:保留 TextField ,但它不能被编辑,有条件地设置 disabled(true),它可以编辑使用 disabled(false) 。

14.7K30

SwiftUI 与 Core Data —— 安全地响应数据

本文将介绍可能在视图中产生严重错误的原因,如何避免,以及在保证视图对数据变化实时响应的前提下如何为使用者提供更好、更准确的信息。由于本文会涉及大量前文中介绍的技巧和方法,因此最好一并阅读。...例如,当你创建一个带有字符串属性的新对象,初始值( 在没有默认值的情况下 )是 nil,这在对象被验证之前( 通常在 save )是没有问题的。...开发者在模型编辑中为属性设置了默认值( 取消可选 ),在 Xcode 自动生成的托管对象类定义代码中仍会将不少类型声明为可选值类型。通过手动修改类型( 将 String?...如今的 Core Data,随着云同步以及持久化存储历史跟踪的普及,数据库中的某个数据可能在任意时刻被其他的设备或同一个设备中使用该数据库的其他进程所删除。... timestamp 为 nil ,将显示当前时间 Text("\((item.timestamp ??

3.3K20

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

有以下几个难点:SwiftUI 功能十分有限在真正要实现诸多功能发现,目前很多场景下仍然要通过 UIKit 才能完成,为此又耗费了些心力学习了点 UIKit 的内容( 至少需要掌握两者之间如何混合使用...模拟NavigationLink 只能使用一次,第二次点会失效,实机没有问题。很难实现直接返回到根视图,通过 dissmiss 只能返回到上层视图。...一个 view 中有基于 ForEach 动态变化的数据,如果该 view 在 sheet 中,数据变化后会导致触发异常,如果将 view 从 Sheet 中提取出来直接显示则无此问题。...开发环境下 app 里云数据库中的数据和 app store 下载的 app 数据不互通( 同一个 id ),开发模拟里的数据也不能和实机的数据云同步,必须在多个实机中才能测试。...由于有了 RelationShip,多数情况下无需自己设计主键,这是一个极大的便利,但需要将数据库手动导出备份却出现了问题。你无法使用系统内置的主键或 ObjectID。

2.5K40

架构之路 (七) —— iOS App的SOLID原则(一)

想象一下,你的桌子上有一堆纸。您可能能够快速找到任何给定的论文,但是其他人在寻找某些东西,就很难找到他们需要的东西。你的代码很像你的办公桌,只是其他人更有可能需要它的东西。...您在一处编辑名称,Xcode 会更改它出现的其他任何地方,包括文件名。 完成名称编辑后,单击右上角的Rename。...请记住,您重构现有项目,按顺序遵循 SOLID 并不重要。正确地做这件事很重要。...prepare() { 然后,在 init(viewContext:reportRange:) 中,在调用 prepare() 之前添加对 super.init()的调用: super.init() 导航...即使将您的代码从一个项目重用到另一个项目也毫不费力。 编写干净且有组织的代码是一个总能得到回报的目标。如果你说,“稍后会清理它”,那个时刻到来时,事情通常会太复杂而无法真正清理。

4.7K10

Swift 周报 第十一期

如果您是服务端开发人员,我们将向您展示如何充分利用 App Store 服务通知、检索用户交易历史的其他方法,以及您的服务出现故障如何进行恢复。...了解如何迁移到最新的 App Store Server API 并整合 App Store 服务通知。...在线活动议程:10:00-10:30 StoreKit 2 的新功能 10:30-11:00 App Store 服务 API 和服务通知新功能 外媒:苹果要供应商从台湾地区向中国大陆供货严格遵守中方规定...另外 Swift 5.6 编译是第一个包含 @preconcurrency 属性的编译,但是有可能这个属性在 5.6 以前就被启用,或者在 Swift 5.6 的开发过程中启用,通过判断版本号就会有误差...有很多的请求未完成,希望延迟此方法的执行,并将异步回调返回给方法调用者。维持 async/await 流程。

1.1K20

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

首先创建一个假设性的需求: 一个可以展示数万条记录的视图 从上个视图进入该视图不应有明显延迟 可以一键到达数据的顶部或底部且没有响应延迟 响应迟钝的列表视图 通常会考虑采用如下的步骤以实现上面的要求:...在 SwiftUI 视图的生命周期研究[3] 一文中,对 List 如何对子视图的显示进行优化做了一定的介绍。...仅通过 ForEach 来指定显示标识,List 会对这些视图的显示进行优化,仅在需要显示才会对其进行实例化。...虽然我们已经找到了导致进入列表视图卡顿的原因,但如何在不影响效率的情况下通过 scrollTo 来实现列表端点的滚动呢?...新的问题 细心的朋友应该可以注意,运行解决方案一的代码后,在第一次点击 bottom 按钮,大概率会出现延迟情况(并不会立即开始滚动)。

9.1K20

SwiftUI 视图的生命周期研究

•在 SwiftUI 生成视图值树发现没有对应的实例SwiftUI 会创建一个实例从而获取它的 body 结果。...•在生成新的视图值树,即使已经有可以对应的实例(该实例并未销毁),SwiftUI 仍可能会创建一个新的实例。...使用新实例SwiftUI 仍会将新的实例同原有的依赖项关联起来。 鉴于以上原因,注册视图依赖项的时机应该在初始化后,获得 body 结果之前。...通常情况下,SwiftUI 在需要渲染屏幕某个区域或需要该区域的数据配合布局,会在视图值树上创建对应的视图。不再需要其参与布局或渲染视图将被销毁。...更确切的表述应该是,视图销毁,将向 task 修饰中的闭包发送任务取消的信号。至于是否取消,仍由 task 中的闭包自己决定。

4.4K30

Swift 周报 第四十二期

4、这里是否违反了运行时契约:当我们将上下文切换到主线程,我们当前的线程应该被阻塞? 5、或者这个合约只针对我们,开发者,系统可以随意违反吗? 无论如何,看起来在这种情况下我们有一个线程被阻塞。...利用 SwiftUI 绑定的大小写键路径,启用基于枚举大小写的导航表单控件使用。 使用大小写键路径组合应用程序功能,在构建和组合不同的应用程序功能特别有用。...案例研究:SwiftUI Bindings 大小写键路径使从枚举而不是一堆独立选项驱动 SwiftUI 导航成为可能。...例如,如果一个视图可以导航两个不同的、互斥的功能,那么最好像这样建模: struct FeatureView: View { @State var destination: Destination...文章提供了相关的示例代码,并说明了编译如何防止在非异步上下文中调度 actor 线程。 话题讨论 那个活在记忆中的帅气少年,已慢慢变成了大叔模样。

21210

【visionOS】从零开始创建第一个visionOS程序

在visionOS中,您可以在同一个场景中包含2D和3D视图,并且可以将这些视图呈现在窗口中或作为人的周围环境的一部分。...导航模板选择的visionOS部分,并选择App模板。出现提示,为项目指定一个名称以及其他选项。 创建一个新的visionOS应用程序时,你可以从配置对话框中配置应用程序的初始场景类型。...构建并运行你的app页面链接 在模拟中构建并运行你的应用,看看它看起来如何。visionOS的模拟一个虚拟背景作为你的应用程序内容的背景。使用键盘和鼠标或触控板在环境中导航并与应用程序交互。...指定的手势发生在实体上SwiftUI执行提供的闭包。 下面的示例将一个点击手势识别添加到上一个示例中的球体视图中。...如果不取消可见空间,那么您尝试打开另一个空间,系统将发出运行时警告。

78340

打造可适配多平台的 SwiftUI 应用

开场白大家好,是肘子。今天要和大家交流的主题是 —— 打造可适配多平台的 SwiftUI 应用。电影猎手我们先看一个例子,然后再进入今天的正题。...当我们将“电影猎手”从 iPhone 移植 iPad 或 Mac 上,除了屏幕可用空间更大之外,另一个显着的变化是使用者可以同时打开多个窗口,并可以在不同的窗口中对“电影猎手”进行独立的操作。...因此,如果我们打算将应用引入一个支持多窗口平台的时候,最好能提前考虑这种情况,想好如何组织应用的状态。...一个场景被创建后,通过 onAppear 里的代码,在 App State 中创建属于它自己的 State 数据,并在场景被删除,通过 onDisappear 里的代码,将当前场景的 State 清除掉...认为,开发者应根据需要采用适宜的手段,而不必拘泥于某种特定的数据流理论或框架。最后,我们来谈谈在将“电影猎手”适配到 macOS ,碰到的另外一个与数据源有关的问题。

3.1K80
领券