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

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

场景的内容视图定义了场景创建的窗口中的视图内容,但场景本身定义了应用程序的整体结构。SwiftUI 4.0 中,WindowGroup 获得了相当大的更新,真正具备了开发 macOS 应用的能力。...不过,传统的 viewModel 意义上,不建议将视图( 结构本身 )作为视图模型。...onAppear、init、viewDidLoadQ:应用程序中, UIHostingController 中托管了 SwiftUI 视图,这些视图都处于一个 UITabBarController...换句话说,如果写 Color.green.task { self.someState += } ,是否能保证视图第一次出现之前状态一定会改变?.../init(for:content: "WindowGroup 上引入了新的 API")),可以让你在打开窗口时向其传递数据。

12.2K20

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

原文发表的博客 肘子的Swift记事本视图变化在前、状态变化在后 SwiftUI 中,某些可编程控件执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。...再次执行上述过程,您会发现在返回上层视图后,应用并不会锁死,一切都恢复了正常。然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好的选择,特别是没有屏蔽手势取消 Sheet 的情况下。...由于返回上层视图时,状态尚未更新,因此清理 AG 时(返回动画运行中),会破坏应用程序的 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。...因此,当我们首先更新状态,然后 SwiftUI 再响应该状态的变化(返回上层视图),即使此时对 AG 进行清理,仍将可以保证 AttributeGraph 的完整性,应用自然不会出现问题。...状态更新滞后不仅存在于本文介绍的两个案例中,当开发者遇到类似情况时,可以尝试采用状态更新优先的开发策略进行修改。总结今年 SwiftUI 已经进入了第五个年头。

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

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

视图变化在前、状态变化在后 SwiftUI 中,某些可编程控件执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。这些控件基本上都是对 UIkit(AppKit)的二次包装。...再次执行上述过程,您会发现在返回上层视图后,应用并不会锁死,一切都恢复了正常。...由于返回上层视图时,状态尚未更新,因此清理 AG 时(返回动画运行中),会破坏应用程序的 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。...因此,当我们首先更新状态,然后 SwiftUI 再响应该状态的变化(返回上层视图),即使此时对 AG 进行清理,仍将可以保证 AttributeGraph 的完整性,应用自然不会出现问题。...状态更新滞后不仅存在于本文介绍的两个案例中,当开发者遇到类似情况时,可以尝试采用状态更新优先的开发策略进行修改。 总结 今年 SwiftUI 已经进入了第五个年头。

26720

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

包含在starter中,因此您可以本教程结束时完成应用程序。 这个示例使用的是Pixabay,这是一个获得许可的照片共享站点。要将图像拉入应用程序,您需要创建一个免费帐户获得一个API密钥。...你可以Search Images的Pixabay API docs中找到。 如果您现在构建运行,您将不会看到任何有趣的东西。 然而,本教程结束时,您将拥有一个功能齐全的道路旅行计划应用程序。...演示者Presenter是架构的“交通警察”,视图view和交互器interactor之间指挥数据,执行用户操作调用路由器视图之间移动用户。 实体Entity表示应用程序数据。...最大的区别是,视图模型View Model与视图控制器不同,只有对视图模型的单向引用。MVVM非常适合SwiftUI。 VIPER更进一步,将视图逻辑与数据模型逻辑分离。...通过使用@Published属性包装器声明视图将能够监听属性的变化自动更新自身。 下一步是将此列表与来自interactor的数据模型同步。

17.4K10

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

tips:应用程序不能控制窗口空间中的位置。系统将每个窗口放置初始位置,根据与应用程序的进一步交互更新该位置。...显示动态3D场景使用RealityKitin页面链接 RealityKit是苹果公司用于创建3D模型和场景的技术,你可以屏幕上动态更新。...当你准备界面中显示3D内容时,使用RealityView。这个SwiftUI视图作为你的RealityKit内容的容器,允许你使用熟悉的SwiftUI技术更新内容。...要显示您的ImmersiveSpace场景,请使用openImmersiveSpace操作打开,该操作从SwiftUI环境中获得。此操作异步运行,使用提供的信息来查找和初始化场景。...当你的空间可见时,其他应用程序仍然隐藏,但当你关闭时,它们会返回。如果你的应用程序定义了多个空格,你必须在显示一个不同的空格之前取消当前可见的空格。

71040

Swift 周报 第四十二期

明天可能会走错路边,希望不会发生这种事,祈祷不会。" Dua Lipa 问道:" 你能说出谁是接班人吗?"...IT之家:苹果公司于 2019 年收购了英特尔大部分智能手机业务,开始认真开发自己的调制解调器硬件,但开发过程并不顺利。...利用 SwiftUI 绑定的大小写键路径,启用基于枚举大小写的导航和表单控件使用。 使用大小写键路径组合应用程序功能,构建和组合不同的应用程序功能时特别有用。...希望展示这些用例将鼓励将案例关键路径纳入语言中,激发进一步的创新应用程序。 案例研究:SwiftUI Bindings 大小写键路径使从枚举而不是一堆独立选项驱动 SwiftUI 导航成为可能。...首先,我们回顾了以前 SwiftUI 中处理动画的方式,指出了其中的一些缺点。

20510

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

构建运行应用程序。 尝试自己添加一些条目: 该应用程序起作用了,但不是最佳状态,也不遵循 SOLID 原则。 您审核项目以识别其缺点之前,您应该了解这些原则是什么。...对于 SwiftUI 预览,您将始终显示日常开支。 只需更改数据源类型,您就可以使视图更加通用。 这显示了这两个文件中有多少代码重复。 现在,即使您创建了一般视图,您仍然没有在任何地方使用它。...打开任何报告确保您的应用程序中没有任何问题。 2....现在,视图依赖于一个抽象协议,您可以使用 Core Data 模型或简单的旧结构来实现。...使修复bug更安全,因为您的对象不会纠缠在一起。编写单元测试更容易。即使将您的代码从一个项目重用到另一个项目也毫不费力。 编写干净且有组织的代码是一个总能得到回报的目标。

4.7K10

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

2) 您使用初始值设定项创建 LoopingPlayerUIView 的新实例返回新实例。 3) SwiftUI 需要更新底层 UIView 时会调用此方法。 现在,将其留空。...如果你反过来做,双击监听器将永远不会被调用。 再次构建运行,您将能够点击和双击来播放剪辑的速度和音量。 这表明添加自定义控件以与自定义视频视图交互是多么容易。...Playing Video Efficiently 继续之前要注意的一件事是播放视频是一项资源密集型任务。 事实上,即使您开始观看全屏视频,您的应用程序也会继续播放这些剪辑。...您还指定您的应用程序使用音频进行“电影播放”,并且您可以将声音与来自其他来源的声音混合。 构建运行,开始备份音乐并再次启动应用程序。 您现在拥有一个视频应用程序,让您可以自由地成为自己船的船长。...您会在左上角看到画中画按钮……否则不会! 缺点是,撰写本文时,iOS 14.5是可用的最新版本,VideoPlayer 的 SwiftUI 视图未显示画中画按钮。

6.9K10

SwiftUI 状态管理系统指南

前言 SwiftUI与苹果之前的UI框架的区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用它的应用程序中管理视图层级的状态。...属性状态 由于SwiftUI主要是一个UI框架(尽管它也开始获得用于定义更高层次结构(如应用程序和场景)的API),其声明式设计不一定需要影响应用程序的整个模型和数据层——而只是直接绑定到我们各种视图的状态...作为一个例子,让我们更新上面定义的ProfileView——通过将管理User模型的责任从视图本身转移到一个新的、专门的对象中。...现在,我们可以用许多不同的方式来描述这样一个对象,但由于我们正在寻找创建一个类型来控制我们的一个模型的实例——让我们把变成一个符合SwiftUI的ObservableObject协议的模型控制器[2]...因此,虽然下面的内容在技术上可能会被编译,但最终会导致运行时的问题——因为当我们的视图更新时被重新创建,UserModelController实例可能会被删除(因为我们的视图现在是的主要所有者):

5K20

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

主程序与扩展程序数据同步Q:有一个主应用程序和一个扩展程序,它们都读取相同的 Core Data 数据库。但是,当我应用程序中进行更改时,的扩展程序重新启动之前不会看到更改。...还是只使用一个 fetchRequest,然后将数据保存在本地,通过上述方法访问( 应该是指第一种方式 )?想知道这里的最佳做法是什么。谢谢!A:一般来说,不同的视图经常使用不同的获取请求。...对于私有上下文,即使使用 performAndWait 通常也不会对 UI 造成影响。...数据手动排序Q:应用程序中,用户可以视图中通过拖放来重新排列项目。...的数据模型中有一个 Int16 类型的 userOrder 属性,视图的行被重新排序后,有什么好的方法来保存数据的新顺序?

3.2K20

SwiftUI 布局 —— 尺寸( 上 )

本文将从布局的角度入手,为你揭开盖 SwiftUI 尺寸概念上面纱,了解掌握 SwiftUI 中众多尺寸的含义与用法;通过创建符合 Layout 协议的 frame 和 fixedSize 视图修饰器的复制品...但由于 SwiftUI视图并没有提供尺寸这一属性,因此即使 SwiftUI 诞生了数年后的今天,如何获取视图的尺寸仍然是网络上的热门问题。...即使你对 Layout 协议不了解或短时间无法使用 SwiftUI 4.0 ,并不会影响你对下文的阅读和理解。...,没有 Layout 协议之前,开发者只能通过获取当前视图以及子视图视图尺寸来实现自定义布局。...撰写本文之前发了个 推文[5],询问大家对 fixedSize 的了解: image-20220711140418269 FW9GLjJVsAAmDXX Text("Hello world")

4.6K20

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

阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建从底部开始的滚动视图Q:如何实现一个底部对齐的滚动视图 macOS 上会不会有糟糕的性能?...采用了常见的解决方案,即旋转滚动视图和里面的每个单元格,以获得预期的倒置列表, iOS 上,这很有效。但在 macOS 上,使 CPU 使用率保持 100%。...解决了之前的一大遗憾。如此一来,边栏视图的样式自由度获得了极大的提高。...macOS APIQ:对于运行 Monterey 的 Mac,能否如何在 SwiftUI 中实现下面需求的建议:打开一个窗口该窗口中初始化数据找到所有打开的窗口确定一个窗口是否打开从不在该窗口的视图中关闭一个窗口...但这个滚动有两大问题,1、是一个未公开的半成品,有可能会被从 SwiftUI 框架中移除;2、不支持懒加载,即使和 Lazy 视图一起使用也会一次性加载全部的视图

14.7K30

SwiftUI 布局协议 - Part2

避免布局循环和崩溃 众所周知我们布局期间不能更新视图状态。这会导致不可预测的结果,很可能会使 CPU 达到峰值。在此之前我们看到过这种情况,即闭包在布局期间运行时,也许当时不是太明显。...过去我们使用 GeometryReader 获取视图尺寸传递值到父视图的时候遇到过这个问题,然后父视图使用该信息去改变视图即使用 GeometryReader 去再一次改变,然后我们就陷入了布局循环...发现更新路径会产生一个循环,即使该路径被绘制为不影响布局的背景视图也是如此,所以为了避免这种循环,我们要确保路径发生改变,然后才更新绑定,这样就可以成功的打破循环。...一个有用的调试工具 回到当 SwiftUI 刚发布的时候,尽力搞清楚布局是如何工作的,希望有一个像我今天要介绍的这种工具 。直到现在,都是最好的工具,用来添加围绕视图的边框观察视图边缘。...总结 即使你不打算写你自己的布局容器,明白它是如何工作也会帮助你理解布局 SwiftUI 的一般工作方式。

2.7K30

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

这意味着,即使我们定义视图的结构体中声明了使用 @State 标注的变量,但只要 body 中没有使用该属性( 通过 ViewBuilder 支持的语法 ),即使该属性发生变化,视图不会刷新。...Text 中不包含 n 的情况下,即使 n 值改变,StateTest 视图的 body 也不会重新计算。...即使为新上下文中的视图进行的关联操作是视图求值操作之前完成的,但由于 n 的变化与关联操作被集中一个 Render Loop 中,这样会导致关联之后并不会强制新关联的视图刷新( 关联后,值并没有发生变化...这是因为 .fullScreenCover 的构造方法中,我们传递的是 show 的 projectedValue( Binding 类型 )由于合并操作的原因, Sheet 视图关联到 n 后,并不会重新更新...解决方案了解了“异常”的原因后,解决避免再次出现类似的奇怪现象已不是难事。

1.9K20

WWDC 23 ,SwiftUI 5 和 SwiftData 的初印象

革命性的动画和视觉效果升级 SwiftUI 原本欠缺一些高级的动画和视觉功能在本次升级中一被补上了,而且苹果大幅更新了动画、转场、Shape、效果等方面的内部实现。...与之前的预判一样,在数据存储领域,苹果不会贸然地另起炉灶,创建一套全新的逻辑。...从这两天的使用来看,在其功能和稳定性得到进一步改善和增强的情况下,确实会给开发者带来更多的便利。...这是目前整理的一些有关 SwiftData 的问题和注意事项( 原文发表推文中,没有进行更系统的归纳): 尚不支持公共和共享数据的云同步 在当前版本中,通过其他上下文(ModelContext)创建的数据并不会自动合并到视图上下文中...开心还是无奈 今年的 WWDC 中,苹果为 SwiftUI 带来了非常大的变革,推出了开发者向往已久的 SwiftData。

35010

WWDC 23 ,SwiftUI 5 和 SwiftData 的初印象

革命性的动画和视觉效果升级 SwiftUI 原本欠缺一些高级的动画和视觉功能在本次升级中一被补上了,而且苹果大幅更新了动画、转场、Shape、效果等方面的内部实现。...与之前的预判一样,在数据存储领域,苹果不会贸然地另起炉灶,创建一套全新的逻辑。...从这两天的使用来看,在其功能和稳定性得到进一步改善和增强的情况下,确实会给开发者带来更多的便利。...这是目前整理的一些有关 SwiftData 的问题和注意事项( 原文发表推文中,没有进行更系统的归纳): 尚不支持公共和共享数据的云同步 在当前版本中,通过其他上下文(ModelContext)创建的数据并不会自动合并到视图上下文中...开心还是无奈 今年的 WWDC 中,苹果为 SwiftUI 带来了非常大的变革,推出了开发者向往已久的 SwiftData。

1.1K20

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

作为项目代码的根结构,的编译、执行的时间都早于其他的代码。 环境注入 SwiftUI提供了多种途径视图之间传递数据。...虽然完全破坏了单向数据流的逻辑和美感,但由于过分的好用,因此SwiftUI的开发中仍被广泛的采用。...目前开发使用SwiftUI+CoreData的应用程序时,将CoreData部分的开发同应用程序的UI构建是完全分离的。...将三个数据库文件(包括wal和shm)一拖入项目中,创建一个使用Bundle中数据库文件的NSPersistentContainer,方便我们预览使用了复杂数据模型视图。...Bundle数据库加强版 上面的Bundle数据库方便了开发者预览拥有复杂数据模型视图。不过由于Bundle是只读的,你动态预览中修改创建的数据并不会被真正的持久化。

5.1K10

Ask Apple 2022 中与 Core Data 有关的问答

应用程序中是否有任何方法可以重置数据的本地缓存副本以假装它是新设备让 CoreData 再次从云中获取所有数据?...用例是:当我打开 Focus 过滤器时,将 @AppStorage 值更改为用户希望应用程序中看到的标签列表。...如果可以创建一个带有与此 @AppStorage 的值相关联的谓词的 @FetchRequest,则谓词将自动更新更新视图。目前无法做到这一点,哪种解决方法能获得类似的结果?...uriRepresentationQ:现在正在为应用程序实现一个 URL 方案,想提供一个打开特定 Core Data 对象的 URL。...通过向其他的上下文传递 ID,通过该 ID 不同线程的上下文中获取托管对象,这样可以确保应用不会出现崩溃。

2.8K20

如何结合 Core Data 和 SwiftUI

设置核心数据需要两个步骤:创建所谓的持久性容器(从容器存储中加载保存实际数据),然后将其注入 SwiftUI 环境中,以便我们所有的视图都可以访问。 Xcode 模板已经为我们完成了这两个步骤。...首先,我们需要打开 Bookworm.xcdatamodeld 开始使用 Xcode 的模型编辑器描述我们的数据。...如果我们对 Core Data 说“这不是必须的”(您可以模型编辑器中完成),仍然会生成可选的 Swift 属性,因为所有 Core Data 关心的是属性保存时具有值——在其他时间它们可以为 nil...我们无法代码中看到该类,因为它是构建项目时自动生成的,就像 Core ML 的模型一样。...这是该项目概述的最后一部分,因此,请将您的代码重设为初始状态,确保您从我们的数据模型中删除了Student实体——我们不再需要

11.8K30

SwiftUI-数据流

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

10K20
领券