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

SwiftUI 4.0 的全新导航系统

SwiftUI 4.0( iOS 16+ 、macOS 13+ )对导航系统作出了重大改变,提供了以视图堆栈为管理对象的新 API ,让开发者可以轻松实现编程式导航。本文将对新的导航系统作以介绍。...分栏布局 在 SwiftUI 4.0 之前的版本,可以这样使用 NavigationView 来创建拥有左右两栏的编程式导航视图: class MyStore: ObservableObject {...动态控制多栏显示状态 另一个之前困扰多栏 NavigationView 的问题就是,无法通过编程的手段动态地控制多栏显示状态。...相当一部分开发者由于版本适配的原因并不会使用新的 API ,因此,每个人都需要认真考虑如下问题: 如何从新 API 中获得灵感 如何在老版本中运用编程式导航思想 如何让新老版本的程序都能享受系统提供的便利...下对 iPad 进行适配: https://www.fatbobman.com/posts/swiftui-ipad/ [4] 用 NavigationViewKit 增强 SwiftUI导航视图

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

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

是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航另一个视图(例如,显示 Sheet 或从列表中选择一选项 )?...在常规宽度下,我们在详细视图中有一带有导航堆栈的侧边栏。在紧凑宽度下,我们有一标签栏,每个标签都有一导航堆栈。...还是有一更可靠的判断方法?A:紧凑( compact )确实对应于一折叠的导航分割视图。...如何改善一包含大量 UITextField 的视图效率Q:我有一包含 132 UITextField 的 SwiftUI 视图。我知道这个数量很大,但这是由业务逻辑决定的。...但是从一文本字段下一文本字段的聚焦感觉不够流畅,而且每当我在一文本字段中输入一字母时,我的 CPU 使用率似乎会飙升到 70% — 100%。

12.2K20

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

开始 首先看下主要内容: 在本教程中,您将了解如何SwiftUI和Combine中使用VIPER体系结构模式,同时构建一允许用户创建公路旅行的iOS应用程序,来自翻译。...路由器Router处理屏幕之间的导航。这与SwiftUI不同,在SwiftUI中,视图显示任何新视图。...路由器Router允许用户从旅行列表视图trip list view导航旅行详细信息视图trip detail view。trip detail视图将显示路线点列表以及路线地图。...router处理从一屏幕另一个屏幕的转换,设置下一视图所需的类。 在命令式UI范例中——换句话说,在UIKit中——路由router将负责显示视图控制器或激活segue。...当您将其放置在NavigationView中时,该链接将成为一按钮,将destination推送到导航堆栈上。 content块可以是任何一SwiftUI视图

17.3K10

我庆幸果断放弃了SwiftUI:它还不够成熟

这是一项很好的技术,响应式方法非常适合许多典型的基于视图的需求,但对如何处理边缘情况,文档中非常缺乏相关的说明。” “这是好主意,但 SwiftUI 的主要问题是完全不成熟。”...首先,由可选对象提供的视图在每次重绘时都是在完全重新创建。我虽然通过缓存稍稍提升了性能表现,但实际体验仍然非常糟糕。事实证明,SwiftUI 检查器视图就是没法提供合理的重绘速度。...但我觉得这可能只是独立问题,并不能因此把 SwiftUI 一棒子打死。所以,我打算继续探索。 越来越慢 在实现了第一检查器之后,我开始研究另一个主题:Sprite 资产编辑器。...但上图展示的效果其实是在 AppKit 中完成的,因为我在 SwiftUI 一直实现不了预期的功能。大家应该注意到了,中间的 SpriteKit 视图上有三按钮(分别是 +、200% 和 -)。...这些按钮只跟管理 SpriteKit 视图缩放的 @State 相关联。尽管几乎不涉及任何其他数据,在界面更新前单击这些按钮,也会产生将近一秒钟的巨大延迟。

4.8K20

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

众所周知,SwiftUI 是一响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示时,应直接对状态进行修改。...这两错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及在滚动中返回上层视图时导致应用崩溃。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一SwiftUI 所有版本中存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...,左上角的 Back 按钮将消失,但视图并没有返回根视图图片如果我告诉你,上述情况正是由前文提到的状态更新滞后所导致,那么你该如何避免这个问题呢?...在我们遇到问题的两场景中,应用程序都恰好使用了导航容器,并且通过特定的操作,使 RunLoop 处于了适合 AG 打包更新的状态。

577110

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

众所周知,SwiftUI 是一响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示时,应直接对状态进行修改。...这两错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及在滚动中返回上层视图时导致应用崩溃。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死 这是一SwiftUI 所有版本中存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...通过自定义返回按钮以及扩展 UINavigationController 的方式,实现了在禁用 Back 按钮后仍支持手势返回,并先修改状态后再进行视图响应。...在我们遇到问题的两场景中,应用程序都恰好使用了导航容器,并且通过特定的操作,使 RunLoop 处于了适合 AG 打包更新的状态。

25720

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

首先,导航 VideoFeedView.swift 并在 SwiftUI 导入的正下方添加以下导入: import AVKit 看看下面这个,你会看到你已经有了一列表和一视频数组。...这包括一播放按钮、一静音按钮和用于前进和后退的 15 秒跳过按钮。 2. Adding Remote Playback 那很容易,对吧? 如何从远程 URL 添加视频播放? 那一定要难很多!...3) 当有人单击播放器视图时,您可以添加一侦听器。 这会切换视频的静音状态。 注意:确保首先添加双击侦听器,然后单击。 如果你反过来做,双击监听器将永远不会被调用。...您会在左上角看到画中画按钮……否则不会! 缺点是,在撰写本文时,iOS 14.5是可用的最新版本,VideoPlayer 的 SwiftUI 视图未显示画中画按钮。...好处是你知道如何SwiftUI 和 UIKit 之间建立桥梁。

6.9K10

AngularDart 4.0 高级-路由概述 顶

当用户执行应用程序任务时,Angular路由器支持从一视图导航下一视图。 本指南涵盖路由器的主要功能,通过演示可以实时运行的小应用程序(查看源代码)演示它们。...它可以将可选参数传递给支持视图组件,以帮助确定要呈现的具体内容。您可以将路由器绑定页面上的链接,并在用户单击链接时导航适当的应用程序视图。...外壳组件有一RouterOutlet,它可以显示路由产生的视图。 它具有RouterLink,用户可以通过路由点击进行导航。...管理从一组件下一组件的导航。 @RouteConfig 使用RouteDefinition列表配置路由。 RouteDefinition 定义路由如何根据URL模式导航组件。...与英雄细节不同,当您键入更新时,危机细节更改是暂时的,直到您通过按下“Save”或“Cancel”按钮保存或放弃它们。 这两按钮都回到危机中心及其危机列表。 不要单击任一按钮

6.1K20

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

在页面链接中探索新的交互方式 人们可以通过看着一元素并轻敲手指来选择它。他们还可以使用特定的手势来缩放、拖动、缩放和旋转对象。...图1 有窗的场景 图2 场景与窗口和3D对象 从一新的Xcode项目开始,添加一些特性来熟悉visionOS的内容和技术。...导航模板选择器的visionOS部分,并选择App模板。当出现提示时,为项目指定一名称以及其他选项。 当创建一新的visionOS应用程序时,你可以从配置对话框中配置应用程序的初始场景类型。...构建并运行你的app页面链接 在模拟器中构建并运行你的应用,看看它看起来如何。visionOS的模拟器有一虚拟背景作为你的应用程序内容的背景。使用键盘和鼠标或触控板在环境中导航并与应用程序交互。...如果你的应用程序定义了多个空格,你必须在显示一不同的空格之前取消当前可见的空格。如果不取消可见空间,那么当您尝试打开另一个空间时,系统将发出运行时警告。

66140

SwiftUI 的动画机制

SwiftUI 采用了声明式语法来描述不同状态下的 UI 呈现,动画亦是如此。官方文档将 SwiftUI 的动画(Animations)定义为:创建从一状态另一个状态的平滑过渡。...在 SwiftUI 中,我们不能命令某个视图从一位置移动到另一个位置,为了实现上述效果,我们需要声明该视图在状态 A 时所处的位置以及状态 B 时所处的位置,当由状态由 A 转到 B 时,SwiftUI...状态、视图标识、动画 既然 SwiftUI 的动画是创建从一状态另一个状态的平滑过渡,那么我们必须对状态(依赖项)的改变可能导致的结果有正确的认识。...这意味着,当数组中出现了两同样的元素(点击添加按钮),SwiftUI 将无法正确识别我们的意图 —— 究竟是想对那个元素(值相同意味着标识也相同)进行操作。...总结 动画是创建从一状态另一个状态的平滑过渡 声明一动画需要三要素 掌握状态的变化所能导致的结果 —— 同一视图的不同状态还是不同的视图分支 时序曲线函数与依赖的关联越精准,产生异常动画的可能性就越小

14.5K40

掌握 SwiftUI 的 Safe Area

掌握 SwiftUI 的 Safe Area 访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验 Safe Area(安全区域)是指不与导航栏、标签栏、工具栏或其他视图控制器提供的视图重叠的内容空间...除非开发者明确要求视图突破安全区域的限制,否则 SwfitUI 将尽力确保开发者创建的视图都被布局安全区域当中。SwiftUI 同时提供了一些方法和工具让开发者对安全区域有所控制。...本文将探讨如何SwiftUI 中获取 SafeAreaInsets、将视图绘制安全区域之外、修改视图的安全区域等内容。...这是因为,我们并没有正确的设置 ignoresSafeArea 另一个重要的参数regions。...safeAreaInsetList2 遗憾的是,在 iOS 15 之前,SwiftUI 并没有提供调整视图安全区的手段,如果我们想通过 SwiftUI 的手段创建一自定义 Tabbar 时,列表中最后的内容将被

7.5K31

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

SwiftUI 中,除了环境值外,另一个具备较多平台“限制”的部分就是视图的 Modifier。...我们都知道 SwiftUI 是一声明式框架。这不仅意味着开发者可以通过声明的方式来构造视图,而且场景(对应着独立的窗口)甚至整个 App 都是基于声明式代码来创建的。...因此,如果我们打算将应用引入支持多窗口平台的时候,最好能提前考虑这种情况,想好如何组织应用的状态。...在很多情况下,开发者只想在应用中保持一 Store 实例。我将通过另一个简单的应用来展示这种场景。我想很多读者此时都不会太赞同在每个场景中创建一独立的 Store 实例这种做法。...通过点击任意窗口中任意 Tab 中的 “Hit Me” 按钮来增加点击次数。点击次数显示在窗口的上方。

3K80

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

与 UIKit 使用的命令式导航方式不同,SwiftUI 作为一声明式框架,感知与设置两者之间是二位一体的关系。读取状态即可获知当前的导航位置,更改状态便可调整导航路径。...我们可以将 NavigationSplitView 视为具备一些预置能力的 HStack,通过在其中声明两或三视图从而创建两列或三列的导航界面。...开发者需要自行对两种导航逻辑的状态进行转换。方案三将演示如何进行这一过程。...比如在本例的 Content 列代码中,为了维持这个限定,只能通过 overlay 来定义占位视图。如果将代码调整成如下样式,则会在转换后丧失程序化导航的能力( 无法通过修改状态,返回上层视图 )。...不过我们可以通过使用另一个 navigationDestination(isPresented:) 修饰器来达到类似的目的。

4.2K30

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

SwiftUI 中,除了环境值外,另一个具备较多平台“限制”的部分就是视图的 Modifier。...我们都知道 SwiftUI 是一声明式框架。这不仅意味着开发者可以通过声明的方式来构造视图,而且场景(对应着独立的窗口)甚至整个 App 都是基于声明式代码来创建的。...因此,如果我们打算将应用引入支持多窗口平台的时候,最好能提前考虑这种情况,想好如何组织应用的状态。...在很多情况下,开发者只想在应用中保持一 Store 实例。我将通过另一个简单的应用来展示这种场景。 我想很多读者此时都不会太赞同在每个场景中创建一独立的 Store 实例这种做法。...通过点击任意窗口中任意 Tab 中的 “Hit Me” 按钮来增加点击次数。点击次数显示在窗口的上方。

1.9K10

SwiftUI Overlay Container 2 —— 可定制、高效、便捷的视图管理器

SwiftUI Overlay Container[1] 是一用于 SwiftUI视图容器组件。一可定制、高效、便捷的视图管理器。...仅需简单配置,SwiftUI Overlay Container 即可帮你完成从视图组织、队列处理、转场、动画、交互显示样式配置等基础工作,让开发者可以将精力更多地投入应用程序视图的实现本身。...历史 2020 年夏天,在为 健康笔记[2] 添加侧向滑动菜单的过程中,我发现在开发中经常会碰到需要在一视图的上方动态添加另一视图的场景,例如(提示信息、广告、浮动按钮、新手指南等等)。...功能与特性 支持多个容器 单一容器内支持多个视图 可在 SwiftUI 视图代码内或视图代码外向任意指定的容器推送视图 可以动态修改容器的配置(除了队列类型) 容器内的视图有多种排列方式 有多种队列类型以指导容器如何显示视图...使用者通过调用容器管理器的特定方法,让指定的容器执行显示视图、撤销视图等工作。 容器管理器的环境值 在 SwiftUI 中,视图代码通过环境值调用容器管理器。

2.1K20

用 Foreman 管理 CentOS Stream | Linux 中国

在 Foreman 网页用户界面中,导航“ 内容(Content) > 内容视图(Content View)”,并点击“ 创建新视图(Create New View)”。...跨生命周期环境推广内容 如果你已经测试了新的软件包,并且确信一切都很稳定,你可以把你的内容视图推广另一个生命周期环境中。...导航“ 内容(Content) > 内容视图(Content Views)”,选择你想推广的内容视图。 点击内容视图的“ 版本(Versions)”标签。...这次选择生命周期环境,例如,“Test”,然后单击“ 推广版本(Promote Version)”。 最后,再次点击“ 推广(Promote)”按钮。...要在 Foreman 中创建一主机,请导航“主机 > 创建主机”。 在“ 名称(Name)”字段中,为主机输入一名称。

82550

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

您已经了解了如何使用@State处理单个视图的局部状态,以及@ObservedObject如何使我们在视图之间传递一对象,以便我们可以共享它。...如果我们使用@ObservedObject,则需要将我们的对象从每个视图传递下一视图,直到它最终到达可以使用该视图视图E,这很烦人,因为B,C和D不在乎它。...这意味着,如果视图A是导航视图,则所有压入导航堆栈的视图都可以访问同一环境。但是,如果视图A以工作表(sheet)的形式显示视图B,则它们不会自动共享环境数据,因此我们需要手动发送。...好的,让我们看一些代码,这些代码展示了如何使用环境对象在两视图之间共享数据。...接下来,我们可以定义两SwiftUI视图以使用我们的新类。

9.5K20
领券