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

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

只有将这些变量重构到视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构或许是好的选择。...是否可以SwiftUI 完成( 不使用 UIKit )?给我一些方向来完成它吗?A:一般来说,建议使用 .safeAreaInset(edge: .bottom) 来实现底部文本字段。...使用 environmentObject 的情况下,如何避免创建实例的视图被重新计算Q:如何在避免重新计算顶层视图 body 的情况下,不同子树的两个视图之间共享状态( 例如 ObservableObject...onAppear、init、viewDidLoadQ:的应用程序 UIHostingController 托管了 SwiftUI 视图,这些视图都处于一个 UITabBarController...A:如果你 iOS 上使用 UITextField 遇到性能问题,你可以尝试避免每个视图都是 UITextField ,默认渲染为 Text ,当文本被点击时动态切换为 UITextField 。

12.2K20

掌握 SwiftUI 的 task 修饰器

欢迎大家 Discord 频道[2] 中进行更多地交流随着 Swift 5.5 引入了 async/await 特性,苹果也为 SwiftUI 添加了 task 视图修饰器,以方便开发者视图使用基于...task 修饰器视图中创建异步任务,除了方便使用基于 async/await 语法的 API 外,开发者也希望能够让这些任务运行在后台线程,以减少主线程的负担。...使用 task 替换 onReceive 可以获得两个好处:减少视图不必要的刷新( 避免重复计算 )在后台线程响应消息,减少主线程的负荷为老版本的 SwiftUI 添加 task 修饰器当前,Swift...了解了两个版本的 task 修饰器的工作原理和调用机制后,为老版本的 SwiftUI 添加 task 修饰器将不再有任何困难。...但过度地通过 task 修饰器视图声明对副作用进行控制,也会对视图的纯粹度、可测试度、复用性等造成影响。开发者应拿捏好使用的分寸。希望本文能够对你有所帮助。

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

掌握 SwiftUI 的 task 修饰器

随着 Swift 5.5 引入了 async/await 特性,苹果也为 SwiftUI 添加了 task 视图修饰器,以方便开发者视图使用基于 async/await 的异步代码。...task 修饰器视图中创建异步任务,除了方便使用基于 async/await 语法的 API 外,开发者也希望能够让这些任务运行在后台线程,以减少主线程的负担。...使用 task 替换 onReceive 可以获得两个好处: 减少视图不必要的刷新( 避免重复计算 ) 在后台线程响应消息,减少主线程的负荷 为老版本的 SwiftUI 添加 task 修饰器 当前,Swift...了解了两个版本的 task 修饰器的工作原理和调用机制后,为老版本的 SwiftUI 添加 task 修饰器将不再有任何困难。...但过度地通过 task 修饰器视图声明对副作用进行控制,也会对视图的纯粹度、可测试度、复用性等造成影响。开发者应拿捏好使用的分寸。 希望本文能够对你有所帮助。

3.5K60

SwiftUI使用 NSUbiquitousKeyValueStore 同步数据

无法对不同的开发者账号指向同一个 iCloud Key-Value Store 的情况进行测试,请有条件的朋友帮忙测试一下并告知,谢谢。... SwiftUI 视图使用 NSUbiquitousKeyValueStore 本节,我们将在不使用任何第三方库的情况下,实现 SwiftUI 视图对 NSUbiquitousKeyValueStore...使用第三方库的情况下, SwiftUI 视图中可以通过桥接@State 数据的形式,将 NSUbiquitousKeyValueStore 的变化同视图联系起来。...事实上,我们不可能对于每个 NSUbiquitousKeyValueStore 的键都采用上述的方式来驱动视图,在下文章我们将尝试使用更加方便的方法来完成同 SwiftUI 的集成工作。...因此需要寻找一种适合 SwiftUI 的方式,将键值对统一配置、集中管理。 @AppStorage 研究[7] 一文介绍过如何对@AppStorage 进行统一管理、集中注入的方法。

4.9K40

高级 SwiftUI 动画 — Part 1:Paths

我们进入这些隐藏的瑰宝之前,想对一些基本的 SwiftUI 动画概念做一个非常快速的总结。只是为了让我们能有共同语言,请耐心听我说。...请注意,使用了一点三角学的知识。这对理解这篇文章的主题并不重要,但如果你想了解更多关于它的信息,写了另一篇文章,阐述了基础知识。你可以 "SwiftUI 的三角公式 "阅读更多内容。...同一个文件的Example4,有一个更复杂的路径。它基本上是相同的形状,但增加了一条连接每个顶点的线。...如果你想尝试一下,但你的形状还没有复杂到让设备挣扎的地步,添加一些渐变和阴影,你会立即看到不同。 接下来有什么内容? 本文的第二部分,我们将学习如何使用 GeometryEffect 协议。...它将打开改变我们的视图和动画的新方法的大门。与 Paths 一样,SwiftUI 没有关于如何在两个不同的变换矩阵之间转换的内置知识。GeometryEffect将有助于我们这样做。

3.7K20

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

本文将解析 SwiftUI 两个由于未能贯彻响应式编程原则而导致的严重错误,并提供相应的解决方案。...这两个错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及滚动返回上层视图时导致应用崩溃。...原文发表的博客 肘子的Swift记事本视图变化在前、状态变化在后 SwiftUI ,某些可编程控件执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。...我们遇到问题的两个场景,应用程序都恰好使用了导航容器,并且通过特定的操作,使 RunLoop 处于了适合 AG 打包更新的状态。...状态更新滞后不仅存在于本文介绍的两个案例,当开发者遇到类似情况时,可以尝试采用状态更新优先的开发策略进行修改。总结今年 SwiftUI 已经进入了第五个年头。

589110

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

A:你最好的选择是使用 ScrollView 和 ScrollViewReader,并在 onAppear 或新内容进来时滚动到最底部的视图不建议尝试旋转滚动视图。...软弃用Q:最近,注意到新的 @ViewBuilder 函数以前的版本是不可用的,弃用信息提示使用新的方法取代老方法,这是 SwiftUI 的 API 设计缺陷还是错过了什么?...连锁动画Q: SwiftUI ,如何实现连锁动画?例如,想先给一个视图做动画,当动画完成后立即启动另一个动画。A:不幸的是,目前不可能实现连锁动画。...Too complex to type checkQ: iOS 14 SwiftUI 遇到一个问题,试图有条件地显示 3 个符合 Shape 协议的对象的一个。...然而,两个内容相同的视图之间的交换并不能使视图顺利地产生动画,因为两者的文本也被动画化了。正在使用仅禁用 TextField 的替代方法,但有没有办法引导动画以使用文档的方法?

14.7K30

SwiftUI 的动画机制

阅读本文前,读者最好已拥有 SwiftUI使用动画编程的经历,或对 SwiftUI 动画的基本使用方法有一定的了解。可以 此处获取本文的全部代码[2] SwiftUI 的动画是什么?... SwiftUI ,我们不能命令某个视图从一个位置移动到另一个位置,为了实现上述效果,我们需要声明该视图状态 A 时所处的位置以及状态 B 时所处的位置,当由状态由 A 转到 B 时,SwiftUI...自定义转场 SwiftUI 实现自定义转场并不困难,除非需要创建炫酷的视觉效果,大多数情况下都可以通过使用 SwiftUI 已提供的可动画部件组合而成。...由于两个分支视图转场时会同时出现,因此只有布局容器才会正确的处理转场动画。Group 只能对其子元素进行统一设置,不具备处理两个分支视图同时出现的情况(会有一个视图分支的转场丢失)。...代码二描述了 show 发生变化时同一个视图的不同状态( offset 的 y 数值不同)。

14.6K40

SwiftUI 布局协议 - Part2

这是个老问题, SwiftUI 刚发布的时候就写过此类问题, Safely Updating The View State [1] 一文可以查看更多信息。 还想再提一下潜在的崩溃。...这是你写任何布局都必须要考虑的。我们提到 SwiftUI 可能会多次调用 sizeThatFits 去测试视图的灵活性。在这些调用,你返回的值应该是合理的。...在这个例子容器中一共有44个视图,所以我们的新容器将会分别以12,12,12和8为一圈。 注意本案例如何使用缓存与子视图通信。...本例创建了两个 UUID 布局值,一个标识视图,另一个作为父视图的 ID。...经常认为这些视图是理所当然的,并将它们视为简单而不复杂的容器,好吧,尝试编写自己的版本,各种情况下复制一个 HStack ,多种类型的视图和布局优先级竞争同一个空间。。。这是一个不错的挑战!

2.7K30

肘子的 Swift 周报 #001

然而,过了一段时间,发现当我从记忆寻找技术线索时,那些仔细筛选、阅读并推荐的文章给我留下了深刻的印象。停刊后,虽然每天也阅读不少文章和博客,但印象没有之前担任编辑时那么深刻。... Fatbobman's Swift Weekly ,除了为订阅者提供个人博客的最新消息外,还会分享其他优秀作者关于 Swift、SwiftUI、Core Data、SwiftData 等方面的内容...近期推荐 Using Core Data and Swift Data side by side[3] Pol Piella Abadia[4] Pol Piella 尝试一个项目中同时使用 Core...Data 和 SwiftData 以指向同一个持久化数据存储,本文将记录他的操作和使用心得。...至少在当前阶段,同时同一个项目中使用 Core Data 和 SwiftData 两个框架的难度并不小。特别是随着数据模型的不断变化,维护两种不同的数据模型和代码将更加困难。

24840

GeometryReader :好东西还是坏东西?

GeometryReader 自 SwiftUI 诞生之初就存在,它在许多场景扮演着重要的角色。然而,从一开始就有开发者对其持负面态度,认为应尽量避免使用。...用 SwiftUI 的方式进行布局 由于对 GeometryReader 的负面看法,一些开发者会尝试寻找其他方式以避免使用它。...请阅读 用 SwiftUI 的方式进行布局[9] 和 SwiftUI 实现视图居中的若干种方法[10] 两篇文章,以了解面对同一个需求,SwiftUI 有多种布局手段。...里子和面子:不同的尺寸数据 SwiftUI ,有一些 modifier 是布局之后,渲染层面对视图进行的调整。...https://www.fatbobman.com/posts/layout-in-SwiftUI-way/ [10] SwiftUI 实现视图居中的若干种方法: https://www.fatbobman.com

46270

ViewBuilder 研究(下) —— 从模仿中学习

,需要使用这种方法来获得视图 body 的类型信息 // EmptyView 此时如果现在我们闭包添加两个 EmptyView 会如何呢?...只创建了至多支持 10 个 component 的 buildBlock 重载,因此我们视图闭包同一个层次最多只能声明 10 个视图。...但对 buildEither 能同时推断 TrueContent 和 FalseContent 两个的类型的能力无法理解。是编译器为 result builders 开的后门吗?...不一样的 buildOptional 仿制 ViewBuilder 的过程,唯有 buildOptional[8] 无法实现的同 SwiftUI 完全一致。...由于 SwiftUI 通过视图层次结构的类型和位置来对视图进行标识,AnyView 将会擦除(隐藏)掉这些重要的信息,因此除非到了必须使用的地步,否则我们应尽量避免 SwiftUI使用 AnyView

3K20

SwiftUI 与 Core Data —— 数据获取

本文中我们将探讨 SwiftUI 视图中批量获取 Core Data 数据的方式,并尝试创建一个可以使用 mock 数据的 FetchRequest。...也做了不少的尝试,但最终发现似乎 FetchRequest 仍是当前 SwiftUI 的最优解。...尽管会增加一点视图的代码量,但这种方法无论从数据流的处理还是线程安全的角度来说几乎都是完美的。不过,最终让放弃上面所有尝试的原因还是因为性能问题。... SwiftUI ,ForEach 会根据数据标识( Identifier )自动处理视图的添加、删除等操作,因此,当在 SwiftUI使用 NSFetchedResultsController...这将有两个作用:数据变化后将引发与其绑定的视图进行更新由于底层数据并不保存在视图中,因此视图存续期中 SwiftUI 可以随时创建新的视图描述实例而无需担心数据丢失虽然苹果没有公开 _makeProperty

4.6K30

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

本文将解析 SwiftUI 两个由于未能贯彻响应式编程原则而导致的严重错误,并提供相应的解决方案。...这两个错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及滚动返回上层视图时导致应用崩溃。...视图变化在前、状态变化在后 SwiftUI ,某些可编程控件执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。这些控件基本上都是对 UIkit(AppKit)的二次包装。...我们遇到问题的两个场景,应用程序都恰好使用了导航容器,并且通过特定的操作,使 RunLoop 处于了适合 AG 打包更新的状态。...状态更新滞后不仅存在于本文介绍的两个案例,当开发者遇到类似情况时,可以尝试采用状态更新优先的开发策略进行修改。 总结 今年 SwiftUI 已经进入了第五个年头。

26720

WWDC 23 ,SwiftUI 5 和 SwiftData 的初印象

本文将聊聊对本届 WWDC SwiftUI 5.0 和 SwiftData 的初步印象。...由于同一个系统存在了两种不同的数据源声明逻辑,这也给初学者带来了更多的困扰。...,直接定位到滚动视图的特定位置,只能使用一次 )、全新的滚动条控制( 闪烁 )、可自定义行视图滚动区域的顶端和显示区域的显示状态( 例如可用其实现类似 watchOS 的滚动到顶端子视图缩小的视觉效果...不考虑兼容旧版本的情况下,认为 SwiftUI 5.0 的升级可以打 95 分(满分 100 分),不过考虑到很多的开发者相当一段时间内还无法使用这些新功能,心情就会异常的低落。...Context 中使用 transaction 尝试保持线程一致,仍会强制报错(即使是一个新创建的 actor 中进行) 同样受到 CloudKit 同步的限制,演示的 Attribute(.unique

1.1K20

WWDC 23 ,SwiftUI 5 和 SwiftData 的初印象

由于同一个系统存在了两种不同的数据源声明逻辑,这也给初学者带来了更多的困扰。...,直接定位到滚动视图的特定位置,只能使用一次 )、全新的滚动条控制( 闪烁 )、可自定义行视图滚动区域的顶端和显示区域的显示状态( 例如可用其实现类似 watchOS 的滚动到顶端子视图缩小的视觉效果...不考虑兼容旧版本的情况下,认为 SwiftUI 5.0 的升级可以打 95 分(满分 100 分),不过考虑到很多的开发者相当一段时间内还无法使用这些新功能,心情就会异常的低落。...这是目前整理的一些有关 SwiftData 的问题和注意事项( 原文发表推文中,没有进行更系统的归纳): 尚不支持公共和共享数据的云同步 在当前版本,通过其他上下文(ModelContext)创建的数据并不会自动合并到视图上下文中...Context 中使用 transaction 尝试保持线程一致,仍会强制报错(即使是一个新创建的 actor 中进行) 同样受到 CloudKit 同步的限制,演示的 Attribute(.unique

35010

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

考虑到配套创作工具 CiderKit 发展成熟的过程也变得愈发复杂,再加上创建各种窗口和 UI 元素的实际需求,决定尝试用用 SwiftUI。...但每当 SwiftUI 更新检查器视图时(这种更新可能出现在移动过程,甚至是输入文本字段的时候),渲染速率都会下降到每秒 10 到 15 帧,而且相当不稳定。这显然让人无法容忍。...但这会导致检查器的值出现延迟,因此地图编辑器的交互过程(比如使用移动工具时)结果不准确,所以效果还是称不上完美。 但我觉得这可能只是个独立问题,并不能因此把 SwiftUI 一棒子打死。...但上图展示的效果其实是 AppKit 完成的,因为 SwiftUI 一直实现不了预期的功能。大家应该注意到了,中间的 SpriteKit 视图上有三个按钮(分别是 +、200% 和 -)。...刚开始以为是因为地图编辑器的 SpriteKit 主视图仍在后台渲染。所以我尝试工作表显示出来后禁用渲染,但结果没有任何改变。 变更从一种环境传播至另一环境时,也遇到了类似的延迟问题。

4.9K20

@State 研究

研究的意义何在 去年底使用SwiftUI写了第一个 iOS app 健康笔记,这是第一次接触响应式编程概念。在有了些基本的认识和尝试后,深深的被这种编程的思路所打动。...不过,使用也发现了一些奇怪的问题。发现在视图(View)数量达到一定程度,随着数据量的增加,整个app的响应有些开始迟钝,变得有粘滞感、不跟手。...数据(状态)驱动 SwiftUI视图是由数据(状态)驱动的。...: 1.通过使用@State,我们可以使用mutating的情况下修改结构的值2.当状态值发生变化后,视图会自动重绘以反应状态的变化。...mutating func update()} 工作原理 前面我们说过 @State 有两个作用 1.通过使用@State,我们可以使用mutating的情况下修改结构的值2.当状态值发生变化后,

2.9K20

SwiftUI 下定制手势

SwiftUI 手势某种程度上降低了使用门槛,但由于缺乏提供底层数据的 API,严重制约了开发者的深度定制能力。...相较 State 有如下不同: •只能在手势的 updating 方法修改,视图其它的地方为只读•在手势结束时,与之关联(使用 updating 进行关联)的手势会自动将其内容恢复到它的初始值•通过...1.2 思路 SwiftUI 预置手势,仅有 DragGesture 提供了可用于判断移动方向的数据。根据偏移量来确定轻扫方向,使用 map 将繁杂的数据转换成简单的方向数据。...2.2 思路 通过计时器指定时间间隔后向闭包传递当前按压的持续时间。使用 GestureState 保存点击开始的时间,按压结束后,上次按压的起始时间会被手势自动清除。...本例,我们选择 TapGesture 的 onEnded 回调用户的闭包 总结 当前 SwiftUI 的手势,暂处于使用门槛低但能力上限不足的状况,仅使用 SwiftUI 的原生手段无法实现非常复杂的手势逻辑

2.6K20

避免 SwiftUI 视图的重复计算

其他建议 需要跳跃视图层级时,考虑使用 Environment 或 EnvironmentObject 对于不紧密的 State 关系,考虑同一个视图层级使用多个 EnvironmentObject...、应用性能表现、测试难易度等方面取得平衡 不存在完美的解决方案,即使像 TCA 这类的热门项目,面对切分粒度高、层次多的 State 时,也会有明显的性能瓶颈 视图的构造参数 尝试改善 SwiftUI...这是因为,我们将 Student 类型作为参数传递给了子视图SwiftUI 比对实例的时候,并不会关心子视图中具体使用了 student 的哪个属性,只要 student 发生了变化,那么就会重新计算...让视图符合 Equatable 协议 为视图自定义判断相等的比对规则 早期的 SwiftUI 版本,我们需要使用 EquatableView 包装符合 Equatable 协议的视图以启用自定义比较规则...,更希望大家将关注点集中于这些技巧背后对应的原理。

9.2K81
领券