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

SwiftUI 4.0 的全新导航系统

SwiftUI 4.0( iOS 16+ 、macOS 13+ )对导航系统作出了重大改变,提供了以视图堆栈为管理对象的新 API ,让开发者可以轻松实现编程式导航。本文将对新的导航系统作以介绍。...NavigationLink 时仍需设定目标视图造成不必要的实例创建开销 较难实现从视图外调用导航功能 “能用,但不好用” 可能就是对老版本编程式导航比较贴切地总结。...,因此无须创建多余的视图实例 对由同一类型的值驱动的目标进行统一管理( 可以将堆栈中所有视图的 NavigationLink 处理程序统一视图中 ),有利于复杂的逻辑判断,也方便剥离代码 NavigationLink...⚠️ 在使用堆栈管理系统的情况下,请不要在编程式导航混用声明式导航,这样破坏当前的视图堆栈数据 下面的代码,如果点击声明式导航,将导致堆栈数据重置。...增强 SwiftUI导航视图[4] 一文的实现方法 其他增强 除了上述的功能, 新的导航系统还在很多其他的地方也进行了增强。

10.3K62

SwiftUI 掌握 ScrollView 的使用:滚动可见性

前言我们的滚动 API 又有一个重要的新增功能:滚动可见性。现在,你可以获取可见标识符列表,或者快速检查监控 ScrollView 内视图的可见性状态。...pause() } } }}上例定义了 VideoPlayerView 视图视图在其可见时自动播放视频内容。...同样,当视图从可见状态转换为不可见状态,即显示的口部分少于 10% 时,也运行闭包。...,通过 NavigationView 进行导航。...此外,在页面底部有一个视频播放器,当视频播放器出现在口内时,它会自动播放,当其离开口时,自动暂停。总结今天,我们学习了如何跟踪 ScrollView 内特定视图的可见性,监控可见标识符列表。

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

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

    在此过程,您还将了解您的iOS项目中的SwiftUI和Combine。 打开启动项目。这包括一些代码,让你开始: 当你构建其他视图时,ContentView启动它们。...路由器Router处理屏幕之间的导航。这与SwiftUI不同,在SwiftUI视图显示任何新视图。...通过使用@Published属性包装器声明它,视图将能够监听属性的变化自动更新自身。 下一步是将此列表与来自interactor的数据模型同步。...SwiftUI将所有目标视图声明为当前视图的一部分,根据视图状态显示它们。...当您将其放置在NavigationView时,链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图

    17.5K10

    如何在Xcode下预览含有Core Data元素的SwiftUI视图

    SwiftUI预设了大量同系统有关的环境值,通过设置或响应这些数据,我们可以修改系统配置或读取系统信息。 SwiftUI视图采用树状结构组织,在任意节点视图注入的环境数据都将影响节点的所有子视图。...对于当前视图的环境注入,必须在其祖先视图中完成。 如果视图中声明了对某个环境数据的依赖,而忘记在其祖先视图中注入,并不会导致编译错误。应用程序在运行至视图时会直接崩溃。...如果你的视图中使用了@Environment(\.managedObjectContext) var viewContext或者@FetchRequest,请务必检查视图对应的PreviewProvider...由于前文中提到的SwiftUI App life cycle的独特性,你无法在根视图中使用单例来注入持久化上下文。...将三个数据库文件(包括wal和shm)一拖入项目中,创建一个使用Bundle数据库文件的NSPersistentContainer,方便我们预览使用了复杂数据模型的视图

    5.1K10

    如何结合 Core Data 和 SwiftUI

    尽管时间相距遥远,Apple 还是投入了大量工作以确保这两种强大的技术能够完美地相互配合使用,这意味着 Core Data 就像始终以这种方式设计一样,已集成 SwiftUI 。...设置核心数据需要两个步骤:创建所谓的持久性容器(从容器存储中加载保存实际数据),然后将其注入 SwiftUI 环境,以便我们所有的视图都可以访问它。 Xcode 模板已经为我们完成了这两个步骤。...我们需要确保获取请求随着时间的推移保持最新,以便在创建或删除学生时,我们的 UI 保持同步。 SwiftUI 有一个解决方案,而且——您猜对了——这是另一个属性包装器。...更好的是,它已经将其添加到 SwiftUI 环境,这就是@FetchRequest属性包装器起作用的原因——它使用了环境可用的任何托管对象上下文。...这是一个引发函数的调用,因为理论上它可能失败。实际上,我们所做的一切都没有失败的可能,因此我们可以使用try?来调用它——–我们不在乎捕获错误。 因此,请将最后一行添加到按钮的操作: try?

    11.8K30

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

    只有将这些变量重构视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构或许是好的选择。...比如说我可以在父级视图中拥有 StateObject,通过 EnvironmentObject 传递对象。然而,如果里面的 @Published 属性改变了,父视图和它的子树也都被重新计算。...对于苹果工程师给予的建议有一点请注意,那就是如果有在父视图中修改环境对象实例的需求,须确保父视图不会被反复重构( SwiftUI 重新创建视图类型的实例 )。...事实上,这些视图( 惰性容器视图 )一旦被创建,其存续期将持续惰性容器被销毁为止。请阅读 SwiftUI 视图的生命周期研究[12] 了解更多内容。...在常规宽度下,我们在详细视图中有一个带有导航堆栈的侧边栏。在紧凑宽度下,我们有一个标签栏,每个标签都有一个导航堆栈

    12.3K20

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

    好吧,@ EnvironmentObject更进一步:我们可以将对象放置环境,以便任何子视图都可以自动访问它。...如果我们使用@ObservedObject,则需要将我们的对象从每个视图传递下一个视图,直到它最终到达可以使用视图视图E,这很烦人,因为B,C和D不在乎它。...例如,如果视图A可以访问环境对象,而视图B在视图A的内部——即视图B放在A的body属性——那么视图B也可以访问环境对象。...这意味着,如果视图A是导航视图,则所有压入导航堆栈视图都可以访问同一环境。但是,如果视图A以工作表(sheet)的形式显示视图B,则它们不会自动共享环境数据,因此我们需要手动发送。...现在,我们将用户置于ContentView环境,但是由于EditView和DisplayView都是ContentView的子级,因此它们自动继承其环境。

    9.7K20

    CoreData 探秘 - 从数据模型构建托管对象实例

    在本文中,我们不会深入讨论从构建数据模型创建托管对象实例的每个细节。...如果我们在模型编辑器创建了新的 Configuration 或 Fetch Request ,也能在 XML 文件中找到对应的信息。在 Xcode 14 ,可视化的关系视图被取消了。...这个关系视图在模型编辑器起到了重要的作用,可以直观地显示实体之间的关系。由于取消了可视化的关系视图,elements 元素的信息基本上失去了作用。...创建托管对象实例的关键并不在于是否有托管对象上下文,而在于告诉 NSManagedObject实例对应的是哪个 EntityDescription。...阅读 如何在 Xcode 下预览含有 Core Data 元素的 SwiftUI 视图 一文,查看此种方法在 SwiftUI 预览的应用。 正如前文所提到的,开发者并不一定要创建托管对象子类的实例。

    26820

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

    创建你的Xcode投影页面链接 在Xcode中选择File >新比;项目。导航模板选择器的visionOS部分,选择App模板。当出现提示时,为项目指定一个名称以及其他选项。...许多SwiftUI视图自动处理交互——你所要做的就是提供在交互发生时运行的代码。...系统自动将以下类型的输入映射到你的SwiftUI事件处理代码: 这张照片显示的是窗户角落里的控件,以及一个人坐在椅子上,双手放在膝盖上的自上而下的叠加视图。 间接的输入。...下面的例子展示了一个使用RealityView来显示3D球体的视图视图闭包的代码为球体创建一个RealityKit实体,在球体表面应用纹理,并将球体添加到视图的内容。...当指定的手势发生在实体上时,SwiftUI执行提供的闭包。 下面的示例将一个点击手势识别器添加到上一个示例的球体视图中

    95040

    探讨 SwiftUI 的几个关键属性包装器

    详见 避免 SwiftUI 视图的重复计算[7]。 如果不需要在当前视图或在子视图中(通过 @Binding )修改值,无需使用 @State。...引入 @StateObject 意味着所有相关操作都在主线程上进行( SwiftUI 隐式为视图添加 @MainActor),包括异步操作。应将需要在非主线程上运行的代码应该从视图代码剥离。...典型应用场景 通常与 @StateObject 配合使用,父视图使用 @StateObject 创建实例,子视图通过 @ObservedObject 引入实例,响应实例变化。...} } } 在视图中引入由外部框架或代码来保证存续期的 ObservableObject 实例时使用,例如引入 Core Data 的 NSManagedObject 实例。...,可以在更高层级的视图中( 稳定性没有问题的地方 ),通过 @State 来持有实例,然后在使用的视图中通过 @ObservedObject 来引入。

    32510

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

    这种做法不仅可以解决跨平台兼容性问题,还有其他好处:可以改善视图中代码的整洁度(减少条件编译语句的使用)可以改善 SwiftUI 在不同版本之间的兼容性当然,要创建使用这类代码,前提是开发者必须已经对...在“电影猎手”,我们在 App 的位置创建了 Store(保存应用状态以及主要处理逻辑的单元)的实例,通过 .environmentObject(store) 注入视图中。...图片由于“电影猎手”采用了编程式导航视图堆栈以及 TabView 的状态都保存在 Store ,因此会出现操作同步的情况。...在 SwiftUI ,只要理解了状态、声明和响应之间的关系,开发者就可以用任何想用的形式来组织数据。无论是将状态进行统一管理,还是分散在不同的视图中,都有各自的优势和意义。...图片这是因为,在 macOS ,使用 Settings 来声明 Settings 窗口同样是创建了一个新的场景,创建一棵独立的视图树。

    3.2K80

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

    这种做法不仅可以解决跨平台兼容性问题,还有其他好处: 可以改善视图中代码的整洁度(减少条件编译语句的使用) 可以改善 SwiftUI 在不同版本之间的兼容性 当然,要创建使用这类代码,前提是开发者必须已经对...盲目地使用这些解决兼容性的代码可能破坏 SwiftUI 创建者的苦心,让开发者无法准确地体现不同平台的特色。...在“电影猎手”,我们在 App 的位置创建了 Store(保存应用状态以及主要处理逻辑的单元)的实例,通过 .environmentObject(store) 注入视图中。...image-20230424093006309 由于“电影猎手”采用了编程式导航视图堆栈以及 TabView 的状态都保存在 Store ,因此会出现操作同步的情况。...创建一棵独立的视图树。

    2.1K10

    StateObject 与 ObservedObject

    相信有人提出这样的疑问,难道下面代码的 testObject 对应的实例,其存续时间小于视图的存续时间吗?...{ Text("Hello \(store.username)") }}当 SwiftUI 开始创建描述生成的视图时,大致进行如下的步骤:创建一个 DemoView 的实例进行与视图有关的一些准备工作...( 例如依赖注入 )对实例的 body 属性求值渲染视图SwiftUI 的角度来说,视图是对应着屏幕上某个区域的一段数据,它是通过调用某个根据描述该区域的声明所创建的实例的 body 属性计算而来...在 SwiftUI视图添加到视图树上时,调用 _makeProperty 方法将需要持有的订阅关系、强引用等信息保存到 SwiftUI 内部的数据池中。...在 @StateObject 研究[4] 一文,展示了因错误使用 ObservedObject 而引发灵异现象的代码片段出现这种情况是因为一旦,在视图的存续期中,SwiftUI 创建了新的实例使用了实例

    2.4K20

    一段因 @State 注入机制所产生的“灵异代码”

    State 注入的优化机制在 SwiftUI ,对于引用类型,开发者可以通过 @StateObject、@ObservedObject 或 @EnvironmentObject 将其注入视图中。...通过这些方式注入的依赖,无论视图的 body 是否使用了实例的属性,只要实例的 objectWillChange.send() 方法被调用,与其关联的视图都将被强制刷新( 重新计算 body 值...(deadline: .now() + 0.1){ // 延迟已保证 Sheet 视图已完成创建 dump(_n) }}Sheet 视图的上下文当 SwiftUI 创建显示一个...也就是说 Sheet 视图与原有视图分别处于不同的上下文中。在 SwiftUI 早期的版本,对于分别位于不同上下文的独立的视图树,开发者需要显式为 Sheet 视图注入环境依赖。...后期版本已为开发者自动完成注入工作。这意味着,相较于在原有视图树上创建分支,在新上下文中重建视图树的开销更大,需要进行的工作也更多。而 SwiftUI 为了优化效率,通常会对若干操作进行合并。

    1.9K20

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

    通俗地说,就是在创建或修改托管对象实例时,Core Data 将自动为派生属性生成值。值依据预设的派生表达式( Derived Expression )通过其他的属性值计算而来。...过长的 I/O 会使您的视图绘图停滞。太短的 I/O 导致你发出太多的单独请求,这会大大降低效率。 Instruments 的 Core Data 性能工具可以帮助调查什么才是最适合您的方案。...我注意,当我使用 Safari 客户端从 CloudKit 数据库删除一条记录时( 通过 CloudKit Dashboard ),对象仍会保留在设备上的 Core Data 数据存储。...数据手动排序Q:在我的应用程序,用户可以在表视图中通过拖放来重新排列项目。...我手动生成了 NSManagedObject 代码实现了 Codable 协议来实现这一目标。有什么更好的处理方法吗?谢谢。A:Codable 无法准确地对对象图中的对象进行单独编码。

    3.2K20

    Core Data with CloudKit (六) —— 共享数据

    托管对象关系(relationship)对应的所有数据都将自动被共享。 针对共享后的托管对象的任何修改都将自动同步所有者和参与者的设备。...当所有者创建了一个共享关系后,系统将自动为其在私有数据库创建一个新的自定义区域(com.apple.coredata.cloudkit.share.xxx-xx-xx-xx-xxx),并将共享的数据(...从共享关系的所有者来看,所有者创建的所有数据都保存在本地的私有数据库。即使数据被共享,其他参与者对数据的修改也保存在所有者的私有数据库。...在SwiftUI lifeCycle模式下,响应发生在UIWindowSceneDelegate。因此需要在AppDelegate中进行转接。...分别为两个持久化存储设定URL,并为共享Description设置shareDescOption.databaseScope = .shared 为Stack添加了便捷方法,方便视图中的逻辑判断。

    1.4K20

    Apriso开发葵花宝典之八Portal Session篇

    导航方式通过页面Screen导航类型来定义: 主页Home:堆栈的第一个屏幕,用于重置整个屏幕堆栈历史 子门户Sub Portal:用于创建新的较低级别屏幕堆栈会话, 标准Normal:将所有相关变量放入屏幕堆栈...页面堆栈Screen Stack: 每个门户会话调用一个相关联的Screen堆栈。在屏幕之间导航时,可以将屏幕推入堆栈或从堆栈拉出呈现给用户。...当导航普通屏幕时,屏幕被放置在屏幕堆栈,可以稍后返回。但是,您可以使用导航类型更改屏幕与屏幕堆栈交互的方式。...门户会话变量通常的规则是: l从上述操作或视图表单中使用的控件返回的任何外部输出都会自动添加到当前门户会话。...Ø当向会话变量添加变量时,后缀“_UI”自动删除 lExternal_Container_UI Ø在Screen提交之后被推送到堆栈(带有来自用户的值) Ø返回时恢复(恢复用户最初输入的值) Ø

    18010

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

    因此在 SwiftUI ,掌握两种导航容器的状态表述差异是实现自适应导航方案的关键。...在栈推送和弹出数据的过程对应了导航容器添加和移除视图的操作。弹出全部数据相当于返回根视图,推送多个数据相当于一次性添加多个视图直接跳转到最后数据所代表的视图。...的视觉状态对于一些简单的两列或三列的导航布局,SwiftUI 可以自动将其转换成 NavigationStack 表现形式。...最好以导航容器所在视图的 sizeClass 作为判断标准。例如,在 Side 列视图中,无论在任何环境下,horizontalSizeClass 始终为 compact 。...不要忘记 NavigationStack 的根视图不在它的“栈”数据在本例,转换至 NavigationStack 时,需要将 Detail 列声明的视图添加到“栈”的底端。反过来则将其移除。

    4.3K30

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

    ,只提取你需要的属性,依靠 SwiftUI 的 equality 检查来提前中止无效计算苹果工程师给出的答案与 避免 SwiftUI 视图的重复计算[5] 一文的很多建议都一致。...然后,您可以使用垂直或水平堆栈布局来组合它,这样您就不需要自己完成所有的实现工作。Jane 的 自动根据宽度排版[10] 视频与问题十分契合。...macOS APIQ:对于运行 Monterey 的 Mac,能否如何在 SwiftUI 实现下面需求的建议:打开一个窗口在窗口中初始化数据找到所有打开的窗口确定一个窗口是否打开从不在窗口的视图中关闭一个窗口...在 Cell 视图中,通过创建 request 从私有上下文中提取数据并转换成图片。另外,可以考虑为原始图片创建缩略图,进一步提高显示的效率。...但这个滚动有两大问题,1、是一个未公开的半成品,有可能会被从 SwiftUI 框架移除;2、不支持懒加载,即使和 Lazy 视图一起使用也一次性加载全部的视图

    14.8K30
    领券