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

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

SwiftUI 4.0 中,contextMenu 的功能获得了不小的提高。例如一个上下文菜单中可以有多个选项、支持 primaryAction、以及定制预览视图。...在使用 environmentObject 的情况下,如何避免创建实例的视图被重新计算Q:如何在避免重新计算顶层视图 body 的情况下,在不同子树的两个子视图之间共享状态( 例如 ObservableObject...阅读 SwiftUI 的动画机制[8] 一文,了解更多有关动画的内容。自适应高度 SheetQ:如何在 iOS16 中呈现与动态内容高度相匹配的 Sheet?...这可能会导致一些不好的后果,例如使视图的重用性降低,并将业务逻辑与 SwiftUI 视图的生命周期挂钩,这将使处理业务逻辑变得更加困难。简而言之,我们不建议使用视图作为视图模型。...开发者目前仍在尝试创建一个优雅地同时为两种模式提供路径的模型。阅读 SwiftUI 4.0 的全新导航系统[13] ,了解它们之间的不同。

12.2K20

SwiftUI 与 Core Data —— 数据定义

遗憾的是,托管对象对于以值类型为主的 SwiftUI 来说并不算友好,因此,不少开发者都会在视图中将托管对象实例转换成一个结构体实例以方便接下来的操作( 如何在 Xcode 下预览含有 Core Data...托管对象的其他优势在视图中用结构体直接表示数据固然方便,但我们仍不能忽略托管对象的其他优势。...对于 SwiftUI 来说,托管对象具备两个非常显著的特点:懒加载托管对象的所谓托管是指:该对象被托管上下文所创建并持有。仅在需要的时候,才从数据库( 或行缓存 )中加载所需的数据。...这个类型除了用于为 SwiftUI 的视图提供数据外,同时也会被用于为其他的数据流提供有效信息,例如,在 Redux 框架中,通过 Action 为 Reducer 提供所需数据。...而且全程预览,交互,测试。

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

SwiftUI 状态管理系统指南

SwiftUI没有使用委托、数据源或任何其他在UIKit和AppKit等命令式框架中常见的状态管理模式,而是配备了一些属性包装器[1],使我们能够准确地声明我们的数据如何被我们的视图观察、渲染和改变。...观察对象 State和Bingding的共同点是,它们处理的是在SwiftUI视图层次结构本身中管理的值。...值得庆幸的是,SwiftUI还提供了一些机制,使我们能够将外部模型对象连接到我们的各种视图。...现在,我们可以用许多不同的方式来描述这样一个对象,但由于我们正在寻找创建一个类型来控制我们的一个模型的实例——让我们把它变成一个符合SwiftUI的ObservableObject协议的模型控制器[2]...观察和修改环境变量 最后,让我们来看看SwiftUI的环境系统如何被用来在两个互不直接连接的视图之间传递各种状态。

5K20

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

中用于管理符合 ObservableObject 协议对象实例的属性包装器,以确保这些实例的生命周期与当前视图一致( 不短于)。...@StateObject 专门用于管理符合 ObservableObject 协议的实例。 标注的对象实例在视图的整个生命周期中保持唯一,即使视图更新,对象实例也不会重新创建。...它允许视图访问SwiftUI 或应用环境提供的数据、实例或方法。...典型应用场景 当需要访问和响应界面样式(暗模式/亮模式)、设备方向、字体大小等由系统或上层视图提供的环境值时( 通常对应值类型)。...选择正确的工具对于构建高效、维护的 SwiftUI 应用是至关重要的。正如在软件开发中经常提到的,没有一种工具是万能的,但恰当地使用它们可以大大提高我们的开发效率和应用质量。

18010

SwiftUI 与 Core Data —— 数据获取

Redux 框架通常都建议开发者将整个 app 的状态合成到一个单一的结构实例中( State ,符合 Equatable 协议 ),视图通过观察状态的变化( 有些框架支持切片式的观察以改善性能 )...尽管在实践中,如果能在确保不访问托管对象的非线程安全属性的前提下,在非创建托管对象的线程中持有托管对象并不会出现崩溃的情况,但出于谨慎的考虑,我最终还是放弃了这种方式。...DynamicProperty 协议为数据提供了访问 SwiftUI 托管数据池的能力。通过未公开的 _makeProperty 方法,数据可以在 SwiftUI 数据池中申请空间进行保存并读取。...在创建自定义 DynamicProperty 类型时,需要注意以下几点:可以在自定义类型中使用环境值或环境对象在视图被加载后,视图中所有符合 DynamicProperty 协议的类型也将一并具备访问环境数据的能力...在下一篇文章中,我们将探讨如何在 SwiftUI 中安全地响应数据,如何避免因为数据意外丢失而导致的行为异常以及应用崩溃。希望本文能够对你有所帮助。

4.6K30

在 iOS 16 中用 SwiftUI Charts 创建一个折线图

此外,自定义图表的外观和感觉以及使图表中的信息易于访问也是非常容易的。 如以前的文章所示,不使用 SwiftUI Charts 也可以创建一个折线图。...系列文章 如何在 SwiftUI 中创建条形图 SwiftUI 中的水平条形图 在 iOS16 中用 SwiftUI 图表定制一个线图 在 Swift 图表中使用 Foudation 库中的测量类型 简单折线图...图表创建的其他图表类型,显示每日步数 使用 SwiftUI 图表创建的其他图表类型,显示每日步数 让折线图增加访问性 将图表植入 SwiftUI 的一个好处是,可以很容易地使用访问性修饰符[2]...使图表变得访问。...图表中使折线图访问性 为折线图添加多个数据序列 折线图是比较两个不同系列数据的好方法。

3.6K20

深度解读 Observation —— SwiftUI 性能提升的新途径

最后,宏添加了让可观察对象遵守 Observable 协议的代码(Observable 协议类似于 Sendable, 它不提供任何实现,仅起标示作用)。...如何在视图中使用可观察对象 在视图中声明可观察对象 与遵守 ObservableObject 协议的 Source of Truth 不同,我们会在视图中使用 @State 来确保可观察对象的声明周期。...可以预期,在开发 iOS 17+ 应用程序时,通过 Observation 框架声明的可观察对象和遵循 ObservableObject 协议的可观察对象,同时出现的场景将越来越少。...在一个视图中,可以同时存在以不同的方式声明的可观察对象SwiftUI 将根据可观察对象在视图中的注入方式选择对应的观察手段。...a.b.b = 100 // or a.b = B() 在 let _ = a.b.b 这一行代码中,同时创建了对两个不同对象、不同层级的可观察属性的观察,a.b 以及 b.b 。

48920

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

本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文为下篇。访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...你可以使用符合 ObservableObject 协议的不同对象来分割失效的范围有时,不依赖 @Published 而获得一些手动控制并直接向 objectWillChange 发布变化是很有用的添加一个中间视图...Swift Identified Collections 是基于 OrderedDictionary 实现的一个拥有键属性的数组。它的唯一要求是元素必须符合 Identifiable 协议。...SwiftUI 当前缺乏动画完成后的回调机制。在动画不复杂的情况下,可以通过创建一个符合 Animatable 协议的 ViewModifier 来同步观察动画的进程。...Too complex to type checkQ:我在 iOS 14 SwiftUI 中遇到一个问题,我试图有条件地显示 3 个符合 Shape 协议对象中的一个。

14.7K30

干货 | 关于SwiftUI,看这一篇就够了

其实View是SwiftUI一个核心的协议,代表了闭包中元素描述。如下代码所示,其是通过一个associatedtype修饰的,带有这种修饰的协议不能作为类型来使用,只能作为类型约束来使用。...@State内部是在Get的时候建立数据源与视图的关系,并且返回当前的数据引用,使视图能够获取,在Set方法中会监听数据发生变化、会通知SwiftUI重新获取视图body,再通过Function Builders...; @BindableObject - 外部数据结构与SwiftUI建立数据存在依赖; @EnvironmentObject - 跨组件快速访问全局数据源; 以上特性的实现是基于Swift的Combine...该框架有两个非常重要的概念,观察者模式和响应式编程。 观察者模式是描述一对多关系:一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。...这两对象分别被称为被观察目标和观察者,一个观察目标可以对应多个观察者,观察者可以订阅它们感兴趣的内容,这也就是文中关键词@State的实现来源,将属性作为观察目标,观察者是存在该属性的多个View。

5.8K10

SwiftUI中使用UIKit视图

SwiftUI中使用UIKit视图 想获得更好的阅读体验可以访问我的博客www.fatbobman.com,或点击下方的阅读原文 已迈入第三个年头的SwiftUI相较诞生初始已经提供了更多的原生功能...本文将通过对UITextField的包装来讲解以下几点: •如何在SwiftUI中使用UIKit视图•如何让你的UIKit包装视图具有SwiftUI风格•在SwiftUI使用UIKit视图需要注意的地方...UIViewRepresentable协议SwiftUI中包装UIView非常简单,只需要创建一个遵守UIViewRepresentable协议的结构体就行了。...UIViewRepresentable本身遵守View协议,因此SwiftUI会将任何符合该协议的结构体都当作一般的SwiftUI视图来对待。...,通常在此方法中可以执行u删除观察器等善后操作。

8.1K20

在iOS 16中用SwiftUI Charts创建一个折线图

在iOS 16中用SwiftUI Charts创建一个折线图 苹果在WWWDC 2022上推出了SwiftUI图表,这使得在SwiftUI视图中创建图表变得异常简单。...此外,自定义图表的外观和感觉以及使图表中的信息易于访问也是非常容易的。 如以前的文章所示,不使用SwiftUI Charts也可以创建一个折线图。...图表创建的其他图表类型,显示每日步数 让折线图增加访问性 将图表植入SwiftUI的一个好处是,可以很容易地使用访问性修饰符使图表变得访问。...然后为图表中的每个标记添加访问性标签和值。...图表中使折线图访问性 在 SwiftUI 图表中使折线图访问性 为折线图添加多个数据序列 折线图是比较两个不同系列数据的好方法。

3.4K20

SwiftUI 之 HStack 和 VStack 的切换

为了使代码可用性更高,我们不会硬编码让两个堆栈变体使用对齐或间距什么的。...一个使用尺寸的例子 相反,让我们使用 Apple 的尺寸系统来决定 DynamicStack 应该在底层使用 HStack 还是 VStack 。...为了观察当前水平方向的尺寸,我们需要用到 SwiftUI 环境系统 — 通过在 DynamicStack 中声明 @Environment - 标记属性(带有 horizontalSizeClass...使用布局协议 虽然我们最后已经用了非常棒的解决方案,可以在所有支持 SwiftUI 的 iOS 版本中使用,但也让我们来探索一下在 iOS 16 中引入的一些新的布局工具(在写这篇文章时,它作为...这都是因为事实证明 Layout 不仅仅是我们第三方开发者的 API ,Apple 也让 SwiftUI 自己的布局容器使用这个新协议

2.8K10

苹果推出 SwiftData,替代 SwiftUI 的 Core Data

SwiftData 轻松将一个 Swift 转换为一个持久化模型,非常适合同 SwiftUI 一并使用。...据苹果公司称,持久性对象会在需要时从持久化存储中获取并更新。 Bool、Int、String 等简单类型支持开箱可用,但更为复杂的类型则必须要符合 Codable 协议,才能于持久化中使用。...而事实上,@Model 宏也会让在符合 ObservableObject 协议的同时,让所有持久化的属性表现为 @Published 属性的形式。...与 @State 和 @Binding 的使用方式相类似,每次底层数据发生变化时,@Query 确保视图的自动重新渲染。...为让开发者能更为轻松地迁移至 SwiftData,该框架支持在现有 Core Data 应用中的逐步采用,在苹果提供的演示项目中展示了如何在一个 Core Data 应用中仅部分使用 SwiftData

89330

【移动开发】InfoQ 2022 年移动和物联网趋势报告

持久连接倾向于取代推送通知和网络轮询,旨在减少访问延迟和功耗。 在 MQTT 和 gRPC 等轻量级协议方面,物联网设备也出现了类似的趋势。...一个需要密切观察的有趣子趋势是最终创建标准化协议和/或专门的第三方解决方案,以使持久连接像即插即用一样简单。...这些 UI 和应用程序中的每一个都了解每个制造商采用的低级网络协议和标准。这导致用户无法从单个接入点控制所有设备的情况不太理想。此外,设备不能相互交谈。...其他一些协议 Byteball、Avalanche,也使用 Tangle 并进行了某些修改。...这些协议的目标之一是在分布式测量中容纳物联网数据,与线性区块链相比,具有改进的性能、扩展性和可追溯性。 IOTA 被定位为一种免费、矿工和无抵押、高度扩展的区块链解决方案。

1K10

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

访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...但是在极少数情况下,例如你需要添加必须在定义中声明的属性,此时应使用 Category/Extension 使你可以控制所需的声明。...都会生成两个文件,而且如果用户在的定义中添加了自定义属性,Xcode 也不会在重新生成的代码中对其进行覆盖。...遗憾的是,监控的变化中并不包括关系对象中的属性值变化。通过谓词重新获取关系对象列表可能是目前最好的方式。...我手动生成了 NSManagedObject 代码并实现了 Codable 协议来实现这一目标。有什么更好的处理方法吗?谢谢。A:Codable 无法准确地对对象图中的对象进行单独编码。

3.2K20

StateObject 与 ObservedObject

访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...欢迎大家在 Discord 频道[2] 中进行更多地交流先说结论StateObject 和 ObservedObject 两者都是用来订阅可观察对象( 符合 ObservableObject 协议的引用类型...StateObject 通过保持一个对可观察对象的强引用,确保了该对象实例的存续期不小于视图的存续期。...ObservedObject 和 StateObject 两者都保存了视图与可观察对象的订阅关系,在视图存续期内,它们都不会主动取消这个订阅,但 ObservedObject 无法确保可观察对象是否会由于被销毁而提前取消订阅...很多情况下,我们需要从视图的角度来理解 SwiftUI 的属性包装器名称,例如:ObservedObject ( 视图订阅某个可观察对象 )StateObject( 订阅某个可观察对象,并持有其强引用

2.4K20

Swift 中的属性包装器

例如,我们可以根据一组规则验证每个新值,可以以某种方式转换分配的值,或者每当值更改时都可以通知一组观察者。...String) { self.wrappedValue = wrappedValue.capitalized } } 请注意,我们需要显式地将传递到初始值中的任何字符串大写,因为属性观察器只有在值或对象完全初始化之后才会触发...首先检查是否有任何赋值为nil,然后再继续将其存储在当前UserDefaults实例中,如下所示: // 因为我们的属性包装器的值类型不是可选的,但是 // 仍然可以包含`nil`值,我们必须引入这个 // 使我们能够将任何赋值转换为类型的协议...但是,有时我们实际上可能希望访问属性包装器本身,而不是其包装的值。在使用Apple的新SwiftUI框架构建UI时,这种情况尤为常见,该框架大量使用属性包装器来实现其各种数据绑定API。...一方面,它使我们能够以与未包装的属性完全相同的方式访问和分配包装的属性———但另一方面,存在的风险是,我们最终将在太多的抽象后面隐藏太多的非显而易见的功能。 Thanks for reading!

2.6K30

SwiftUI 布局 —— 尺寸( 上 )

访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验。...不过需要注意的是,在 SwiftUI 中,有一视图是会在视图树上显示为父视图,但并不具备布局能力。其中的代表有 Group、ForEach 等。...这类视图的主要作用有: 突破 ViewBuilder Block 的数量限制 方便为一组视图统一设置 view modifier 有利于代码管理 其他特殊应用, ForEach 支持动态数量的子视图等...尽管 Layout 协议的主要用途是让开发者创建自定义布局容器,且在 SwiftUI 中仅有少数的视图符合该协议,但从 SwiftUI 1.0 开始,SwiftUI 视图的布局机制便基本与 Layout...可以说 Layout 协议是一个用来观察和验证 SwiftUI 布局运作原理的优秀工具。 建议尺寸 SwiftUI 的布局是从外向内进行的。

4.6K20
领券