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

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

.}// 可以用类似字典方式对元素进行操作,快速定位,同时更新 IdentifiedArray ,也不容易引发 ForEach 异常todos[id:id] = newTodo自定义布局Q:实现自定义布局...但是,此转换仅在文本字段完成编辑才会发生,并且不会阻止输入非数字字符。目前 SwiftUI 没有 API 可以限制用户字段输入字符。...软弃用Q:最近,我注意到新 @ViewBuilder 函数以前版本是不可用,弃用信息提示我使用方法取代老方法,这是 SwiftUI API 设计缺陷还是我错过了什么?...A:是的,不幸是,像这样大型构造器表达式有时会让 Swift 编译器难以处理。遇到这种错误解决办法是把表达式拆成更小表达式,特别是如果这些小表达式被赋予了明确类型。...这是一个多个版本中都出现过奇怪问题。 SwiftUI 早期版本,当在 iOS 中使用系统中文输入法,很容易触发这种情况。但后期逐步得到了修复。

14.7K30

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

例如,当你创建一个带有字符串属性新对象,初始值( 没有默认值情况下 )是 nil,这在对象被验证之前( 通常在 save )是没有问题。...Core Data 受限于 Objective-C 可表达类型限制,在即使使用了标量转换情况下( Scalar )也不具备与 Swift 原生类型对应能力。...可能开发者会有这样疑问,假如某个实体属性模型中被定义为可选,且托管对象类型声明也为可选值类型( 例如上方 timestamp 属性 ),那么如果在可以保证 save 一定有值情况下,是否可以使用使用...并没有出现崩溃情况。难道我们上面的论述都是错误?由于 Core Data 模版代码,只使用了一行代码来声明次级视图:Text("Item at \(item.timestamp!...任何可能脱离视图传递过程都应使用托管对象实例对应类型版本。更改数据进行二次确认为了避免对主线程造成过多影响,我们通常会在私有上下文中进行会对数据产生变化操作。

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

SwiftUI 与 Core Data —— 数据获取

由于最终我们需要在视图使用 AnyConvertibleValueObservableObject( 托管对象 ),因此数据获取过程必须是主线程上下文中进行( 数据绑定上下文是 ViewContext... SwiftUI ForEach 会根据数据标识( Identifier )自动处理视图添加、删除等操作,因此,当在 SwiftUI使用 NSFetchedResultsController...创建自定义 DynamicProperty 类型,需要注意以下几点:可以自定义类型使用环境值或环境对象视图被加载后,视图中所有符合 DynamicProperty 协议类型也将一并具备访问环境数据能力...但如果在视图尚未加载或没有提供环境值( 例如忘记注入环境对象,没有提供正确视图上下文情况下访问环境数据,将引发应用崩溃。...当 SwiftUI 视图存续期中重新创建视图描述实例,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议 Struct

4.6K30

ViewBuilder 研究(上)—— 掌握 Result builders

为什么复杂 SwiftUI 视图容易 Xcode 上卡死或出现编译超时 为什么会出现 “Extra arguments” 错误提示(仅能在同一层次放置有限数量视图) 为什么要谨慎使用 AnyView...当一个结果构建器提供了 buildOptional(_:),转译后函数可以使用没有 else if 语句,同时也提供了对 if let 支持。...buildExpression(_ expression: Expression) -> Component 它允许结果构建器区分表达式类型和组件类型,为语句表达式提供上下文类型信息。...构建器转译,将递归地应用上述规则。 或许大家会奇怪, buildEither 实现如此简单,并没有太大意义。 result builders 提案过程也有不少人有这个疑问。...SwiftUI 创建自定义视图控件能力。

3K20

Text 实现基于关键字搜索和定位

本节内容仅代表我考虑处理上述问题想法和思路。其中不少功能已经超出了原本需求,增加这些功能一方面有利于更多地融汇以前博客知识点,另一方面也提高了解题乐趣。...( 上面的代码使用了隐式 ForEach 形式 ) View 添加显式标识符后( 使用 id 修饰器),视图刷新,List 将会为 ForEach 所有视图创建实例( 并非渲染 )用以比对视图类型构造参数是否发生变化...请阅读 优化 SwiftUI List 显示大数据集响应效率[6] 以及 避免 SwiftUI 视图重复计算[7] 两篇文章,了解更多有关性能优化方面的内容通过 currentPostion 获取需要滚动到...List ,每个视图进入显示窗口都会调用它 onAppear,每个视图退出显示窗口都会调用它 onDisapper。...SwiftUI 视图中打开 URL 若干方法[10] 一文,了解更多有关 OpenURLAction 内容创建体验感优秀搜索条使用 safeAreaInset 添加搜索栏没有 safeAreaInset

4.2K30

SwiftUI 动画机制

SwiftUI ,我们不能命令某个视图从一个位置移动到另一个位置,为了实现上述效果,我们需要声明该视图状态 A 所处位置以及状态 B 所处位置,当由状态由 A 转到 B SwiftUI...当需要传递更多参数,可嵌套使用 AnimatablePair 类型,如: AnimatablePair<CGFloat, AnimatablePair<Float, AnimatablePair<Double...自定义转场 SwiftUI 实现自定义转场并不困难,除非需要创建炫酷视觉效果,大多数情况下都可以通过使用 SwiftUI 已提供可动画部件组合而成。...-05-09 15_14_45 有关视图结构性标识内容可以参阅 ViewBuilder 研究(下) —— 从模仿中学习[7] 显式标识 SwiftUI ,为视图设置显式识别有两种方式:ForEach...item 指定 transition ,又一个没有原始控件很好兼容 SwiftUI 动画例子。

14.5K40

SwiftUI 动画进阶 — Part 5:Canvas

文章最后,我将指出我找到一些解决方法。 一个简单 Canvas 简而言之,画布Canvas 是一个 SwiftUI 视图,它从一个渲染闭包获得绘制指令。...与 SwiftUI API 大多数闭包不同,它不是一个视图生成器。这意味着我们可以使用 Swift 语言且没有任何限制。 该闭包接收两个参数:上下文context 和 尺寸size。...上下文使用一个新 SwiftUI 类型 GraphicsContext,它包含了很多方法和属性,可以让我们绘制任何东西。下面是一个关于如何使用 Canvas 基本例子。...例如,在这种情况下使用.animation和.animation(minimumInterval: 0.06)视觉上没有明显区别。然而,测试硬件上,CPU使用率从30%下降到14%。...每一列都被实现为一个单独SwiftUI视图。叠加字符和用渐变绘图是由视图处理。当我们画布上使用渐变,起始/结束点或任何其他几何参数都是相对于整个画布

2.6K10

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

SwiftUI 4.0 ,contextMenu 功能获得了不小提高。例如一个上下文菜单可以有多个选项、支持 primaryAction、以及可定制预览视图。...使用 environmentObject 情况下,如何避免创建实例视图被重新计算Q:如何在避免重新计算顶层视图 body 情况下不同子树两个子视图之间共享状态( 例如 ObservableObject...事实上,这些视图( 惰性容器视图 )一旦被创建,其存续期将持续到惰性容器被销毁为止。请阅读 SwiftUI 视图生命周期研究[12] 了解更多内容。...构造函数初始化 @StateObjectQ:是否有办法视图中用该视图结构参数初始化一个 @StateObject ?A:可以通过 init 方法手动初始化 @StateObject 来实现。...某些情况下,利用惰性视图修饰器,不仅可以保持视图身份稳定,同时也能获得 SwiftUI 更多优化。例如用 .opacity(value < 10 ?

12.2K20

Swift 周报 第四十二期

然而,有一些情况下类型擦除是不幸,因为它不允许可能且有必要处理所有错误狭窄位置进行更精确错误类型化,或者类型擦除成本很高情况下。...以至于某些情况下,用户认为即使是单个表达式也必须包含在闭包。do 表达式将提供更清晰习惯用法来对这些进行分组。...,以便您可以使用 sheet(item:)、popover(item:)(以及更多视图修饰符。...接着,我们介绍了 SwiftUI 引入 animation 视图修饰符新变体,允许我们使用 ViewBuilder 闭包来限定动画范围。最后,我们还提到了视图层次结构维护作用域事务方法。...本文中,探讨了调用带有任何 actor 属性标记方法影响。 异步上下文中,文章讨论了使用 Actors 线程调度。通常情况下,您可能会在异步环境中使用 Actors 。

19910

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

也就是当显示主界面菜单,列表视图已经完成了实例创建(可以通过 ListEachRowHasID 构造函数添加打印命令得以证明),因此也不应是实例化列表视图导致延迟。...)视图类型和具体位置来区分视图。... SwiftUI 视图设置显式标识目前有两种方式: ForEach 构造方法中指定 由于 ForEach 视图数量是动态且是在运行时生成,因此需要在 ForEach 构造方法中指定可用来标识子视图...使用了 id 修饰符相当于将这些视图ForEach 拆分出来,因此丧失了优化条件。 总之,当前在数据量较大情况下,应避免 List ForEach 视图使用 id 修饰符。...生产中处理方式 本文为了演示 id 修饰符 ForEach 异常状况以及问题排查思路,创建了一个在生产环境几乎不可能使用范例。

9K20

SwiftUI + Core Data App 内存占用优化之旅

、惰性视图中子视图生命周期、托管对象惰值特性以及持久化存储协调器行缓存等内容有更多了解。...SwiftUI 惰性视图容器拥有对符合 DynamicViewContent 协议内容( 通过 ForEach 生成内容 )进行优化能力。...正常情况下( 惰性容器仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内视图实例,并对其 body 进行求值( 渲染 )。...在这种情况下,我们可以通过引用类型来创建一个 Holder,通过该持有器,解决释放不积极问题。...} 最终代码,我们对图片数据在内存三个备份实现了有效控制。同一间( 理想情况下 ),只有出现在可视区域图片数据才会保存在内存

1.2K10

SwiftUI + Core Data App 内存占用优化之旅

、惰性视图中子视图生命周期、托管对象惰值特性以及持久化存储协调器行缓存等内容有更多了解。...SwiftUI 惰性视图容器拥有对符合 DynamicViewContent 协议内容( 通过 ForEach 生成内容 )进行优化能力。...正常情况下( 惰性容器仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内视图实例,并对其 body 进行求值( 渲染 )。...在这种情况下,我们可以通过引用类型来创建一个 Holder,通过该持有器,解决释放不积极问题。...} 最终代码,我们对图片数据在内存三个备份实现了有效控制。同一间( 理想情况下 ),只有出现在可视区域图片数据才会保存在内存

2.4K40

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

这意味着,即使我们定义视图结构体声明了使用 @State 标注变量,但只要 body 没有使用该属性( 通过 ViewBuilder 支持语法 ),即使该属性发生变化,视图也不会刷新。...,SwiftUI 才执行 .sheet 闭包函数,创建 Sheet 视图。...也就是说 Sheet 视图与原有视图分别处于不同上下文中。 SwiftUI 早期版本,对于分别位于不同上下文独立视图树,开发者需要显式为 Sheet 视图树注入环境依赖。...这意味着,相较于原有视图树上创建分支,上下文中重建视图开销更大,需要进行工作也更多。而 SwiftUI 为了优化效率,通常会对若干操作进行合并。...面对这些“灵异现象”,如果我们能对其进行更多研究,那么不仅可以今后避免类似的问题,而且分析过程,也能对 SwiftUI 各种运行机制有深入掌握。希望本文能够对你有所帮助。

1.9K20

掌握 Transaction,实现 SwiftUI 动画精准控制

同时, SwiftUI 动画系统,有关 Transaction 解释很少,无论是官方资料还是第三方文章,都没有对其运作机制进行系统阐述。...欢迎大家 Discord 频道[2] 中进行更多地交流 Transaction 是什么 transaction 是一个值,包含了 SwiftUI 处理当前状态变化时需要了解上下文,其中最重要是用于计算插值动画函数...状态变化时,与当前变化状态有关联可动画组件(通常遵守 Animatable 协议)将获取本次状态变化上下文(transaction),得到动画曲线函数,并使用它来计算插值。...使用“显式动画”,通过局部声明“隐式动画”来避免部分视图出现动画异常。 需要情况下,可以通过 TransactionKey 提供更丰富上下文信息 尽量不在一次状态改变修改过多属性。...包装 UIKit 或 AppKit 控件,应添加检查当前 transaction 逻辑。 iOS 17 更多导航组件已支持通过使用“显式动画”来屏蔽动画转场。

42420

如何让 SwiftUI 列表变得更加灵活

使用新速记语法 让我们从一个很小特性开始,这是一个非常受欢迎变化,可以使用类似 enum 速记语法来引用 SwiftUI 附带任何内置 ListStyle 类型。...为了演示这种情况,我们 List 嵌套一个 ForEach (因为 SwiftUI ,列表变化一版都是由 ForEach 触发,而不是由 List 触发)。...,即使我们应用程序较旧操作系统版本上运行,也是没有问题。...由于每个 article 值 ForEach 闭包中都是可变,我们可以使用 swipeActions 修饰符来实现每个 NavigationLink 项目视图自定义滑动操作。...SwiftUI使用,请查看昨天这篇文章[1],不要错过真正重要 Swift 认识 async/await[2]”WWDC 会议。

4.8K41

SwiftUI 实现视图居中若干种方法

欢迎大家 Discord 频道[2] 中进行更多地交流将某个视图视图中居中显示是一个常见需求,即使对于 SwiftUI 初学者来说这也并非难事。...因此第一个例子,即使没有为 HStack 设置 spacing ,Text 仍然会使用全部 HStack 宽度。...().fill(.clear)使用 SwiftUI 进行开发过程,Color、Rectangle 等经常被用来实现对容器等分操作。...请阅读 SwiftUI 布局 —— 对齐[5] ,了解更多有关 ZStack、overlay、background 对齐机制Geometry虽然有些大材小用,但当我们需要获取更多有关视图信息,GeometryReader...我为本文这种通过多种方法来解决一个问题方式添加了【小题大作】标签,目前使用该便签文章还有: Core Data 查询和使用 count 若干方法[6]、 SwiftUI 视图中打开 URL

6.6K40

避免 SwiftUI 视图重复计算

并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应视图SwiftUI 上有一个困扰了不少人问题:为什么无法视图构造函数,更改 State 包装变量值?...of Truth( 符合 DynamicProperty 协议属性包装器 ),只要在视图类型声明了,无论是否视图 body 中被使用它给出刷新信号,当前视图都将被刷新。...在这些创建实例操作,绝大多数目的都是为了检查视图类型实例是否发生了变化( 绝大多数情况下,变化是由构造参数值发生了变化而导致 )。...另外,不要在视图构造函数为属性( 没有使用符合 DynamicProperty 协议包装器 )设置不稳定值( 例如随机值 )。...这是因为,我们将 Student 类型作为参数传递给了子视图SwiftUI 比对实例时候,并不会关心子视图中具体使用了 student 哪个属性,只要 student 发生了变化,那么就会重新计算

9.1K81

Swift 5.4 新特性

Swift 一直具有对简单表达式使用隐式成员语法能力,例如,如果您想在 SwiftUI 为某些文本着色,则可以使用 .red 而不是 Color.red: struct ContentView1:...它们为 SwiftUI 视图创建系统大部分提供了支持,因此,当我们拥有一个内部包含各种视图 VStack ,Swift 会将它们静默地分组为内部 TupleView 类型,以便可以将其存储为 VStack...实际上,通过将更多方法添加到您构建器类型,结果构建器可以实现更多功能。...可以根据所使用类型选择要运行函数。...Swift 5.4 之前,只有未嵌套在 makeCookies() 情况下,才可以重载这三个 add() 方法,但是从 Swift 5.4 开始,在这种情况下也支持函数重载。

1.6K40

WWDC 23 ,SwiftUI 5 和 SwiftData 初印象

不考虑兼容旧版本情况下,我认为 SwiftUI 5.0 升级可以打 95 分(满分 100 分),不过考虑到很多开发者相当一段时间内还无法使用这些新功能,心情就会异常低落。...从我这两天使用来看,在其功能和稳定性得到进一步改善和增强情况下,它确实会给开发者带来更多便利。...这是我目前整理一些有关 SwiftData 问题和注意事项( 原文发表推文中,没有进行更系统归纳): 尚不支持公共和共享数据云同步 在当前版本,通过其他上下文(ModelContext)创建数据并不会自动合并到视图上下文中...性质与通过宏创建 Observed 状态类似,可直接驱动视图更新(传递无需使用属性包装器) Attribute 派生选项被废弃了 可以 Xcode 中使用 Model Editor 将 Model...一开始看到这些信息,我内心无比兴奋,但很快就平静下来了,最终还有些无奈。 对于绝大多数开发者来说,一旦能够应用中使用这些新功能,苹果或许又会带来更多新诱惑。

34410

SwiftUI 视图生命周期研究

类型树在编译后就已经固定, app 生命周期内都不会发生变化。 视图值树 SwiftUI 视图是状态函数[2]。...• SwiftUI 生成视图值树,当发现没有对应实例SwiftUI 会创建一个实例从而获取它 body 结果。...通常情况下SwiftUI 需要渲染屏幕某个区域或需要该区域数据配合布局,会在视图值树上创建对应视图。当不再需要其参与布局或渲染视图将被销毁。...ScrollView + VStack ,即使 Cell 视图没有显示屏幕,仍会触发 onAppear ScrollView { VStack { ForEach(0..<100...在前文视图值树介绍我们提到,当 SwiftUI 重建该树,如果树上某个节点(视图 Source of truth 没有发生变化,将不重新计算,直接使用旧值。

4.3K30
领券