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

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

是否可以在纯 SwiftUI 中完成( 不使用 UIKit )?给我一些方向来完成它吗?A:一般来说,我建议使用 .safeAreaInset(edge: .bottom) 来实现底部文本字段。...最近,我注意到 SwiftUI 视图的 onAppear 在意想不到的时间启动,比如当 UITabBarController 被创建时,而不是当视图本身出现时。...开发者目前仍在尝试创建一个可优雅地同时为两种模式提供路径的模型。阅读 SwiftUI 4.0 的全新导航系统[13] ,了解它们之间的不同。...使用它们应该只创建一个实例,然后可以在子视图中读取。这应该不会增加内存的使用( 如果有的话,请提出反馈 )。如果你向你的模型对象追加越来越多的数据,你可能会增加内存的使用,这是很正常的。...} }}LabeledContentQ:Label 有时被( 误 )用来为一个值提供文字说明( 例如,账户余额为 10 美元 ),但一些开发人员没有意识到这个说明在 VoiceOver 中无法被读取

12.3K20

SwiftUI 视图的生命周期研究

SwiftUI 视图的生命周期研究 访问我的博客 www.fatbobman.com[1] ,获得更好的阅读体验 在 UIKit(AppKit)的世界中,通过框架提供的大量钩子(例如 viewDidLoad...在进行更详尽说明之前,请大家先明确两个观点: •SwiftUI 没有同 UIkit(AppKit)对应的视图与视图生命周期•应避免对 SwiftUI 视图的创建、body 的调用、布局与渲染等的时机和频率进行假设...•在 SwiftUI 生成视图值树时,当发现没有对应的实例时,SwiftUI 会创建一个实例从而获取它的 body 结果。...body 值是在主线程上进行的,并且 SwiftUI 必须在一个渲染周期内完成所有的计算、比较、布局等工作。...,将完成依赖项的建立工作•在视图的生命周期中,只有一个依赖项副本•在视图的生命周期中,无论创建多少个实例,同一时间只有一个实例可以连接到依赖项•依赖项为视图的 Source of truth 了解 SwiftUI

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

    onAppear 的调用时机

    onAppear( task )是 SwiftUI 开发者经常使用的一个修饰符,但一直没有权威的文档明确它的闭包被调用的时机。...这会让开发者误以为 onAppear 是在视图渲染后( 使用者看到后 )才被调用的。但在 SwiftUI 中,onAppear 实际上是在渲染前被调用的。...在写 SwiftUI 视图的生命周期研究 一文时,我们只能通过现象来推断 onAppear 的调用时机,随着版本的不断提高,SwiftUI 4 中为我们提供了足够的工具让我们可以获得更加确实的证据。...viewWillAppear 则是在 UIViewController 被呈现前( 可以理解为渲染前 ),会由 UIKit 调用。...,此时 newWords 已经有值了,ForEach 将正常处理所有的子视图总结在本文中,我们通过 SwiftUI 4 提供的新工具明确了 onAppear 的调用时机,或许这是新 API 开发时未曾想到的功能应用

    2.1K20

    在SwiftUI中使用UIKit视图

    ,但仍有大量的事情是无法直接通过原生SwiftUI代码来完成的。...比如onAppear同viewWillAppear的表现很类似。同UIKit的钩子方法的位置有很大的不同, onAppear和onDisappear是在当前视图的父视图上声明的。...将UIKit视图包装成SwiftUI的视图时,我们需要了解两者生命周期之间的不同,不要强行试图找到完全对应的方法,要从SwiftUI的角度来思考如何调用UIKit视图。...通常需要开发者在UIViewRepresentable视图的Coordinator(协调器)中做一些的工作,从而保证两个框架(SwiftUI同UIKit)代码之间的沟通和联系。...Introspect通过自省的方法来尝试查找原生控件背后包装的UIKit(或AppKit)组件。目前官方尚未在SwiftUI中开放的功能多数可以通过此扩展库提供的方法来解决。

    8.3K22

    老人新兵 —— 一款 iOS APP 的开发手记

    ,直到后来由于功能的需要在 SwiftUI 下混合使用 UIKit 开发才真正体会到了声明式的优势。...有以下几个难点:SwiftUI 功能十分有限在真正要实现诸多功能时发现,目前很多场景下仍然要通过 UIKit 才能完成,为此又耗费了些心力学习了点 UIKit 的内容( 至少需要掌握两者之间如何混合使用...在最后的 app 里面有接近一半的显示控制其实都是在 UIKit 下完成的,即使像 TextField 这样最基本的需求,SwiftUI 的原生版本有时都无法胜任。...同样代码,有时可以正常编译,有时不能。同样的 Form 代码,有时在 Sheet 中可以正常编译,移出 Sheet 又编译错误,有时反之。...其他的以后有时间再写虽然目前仍有很多不足,但 SwiftUI + Combine 的方向绝对正确,即使在当下也可以带来很大的效率提升。再过 2—3 年,相信能有非常大的提高。

    2.5K40

    掌握 SwiftUI 的 task 修饰器

    详情请参阅 SwiftUI 视图的生命周期研究[3] 一文中有关 onAppear 和 onDisappear 的章节SwiftUI 为了判断视图的状态是否发生了改变,它会在视图的存续期内,反复地生成视图类型实例以达成此目的...Swift 采用的是协作式任务取消机制,也就是说,SwiftUI 是无法直接停止掉我们通过 task 修饰器创建的异步任务的。...当满足了需要停止由 task 修饰器创建的异步任务条件时,SwiftUI 会给该任务发送任务取消信号,任务必须自行响应该信号并停止作业。...作为一个事件源类型的 Source of Truth,每当接收到一个新的消息时,它都会导致 SwiftUI 对视图的 body 重新求值。...在了解了两个版本的 task 修饰器的工作原理和调用机制后,为老版本的 SwiftUI 添加 task 修饰器将不再有任何困难。

    2.2K30

    掌握 SwiftUI 的 task 修饰器

    原文发表于我的博客 肘子的Swift记事本 task vs onAppear SwiftUI 提供了两个版本的 task 修饰器,版本一的作用和调用时机与 onAppear 十分类似: public func...图片 我们的本意是通过按钮来开启和关闭计时器的显示以控制任务的生命周期( 关闭时结束任务 ),但在点击 Hide Timer 按钮后,app 出现了无法响应且控制台仍在持续输出( 不按照原定的间隔时间...Swift 采用的是协作式任务取消机制,也就是说,SwiftUI 是无法直接停止掉我们通过 task 修饰器创建的异步任务的。...作为一个事件源类型的 Source of Truth,每当接收到一个新的消息时,它都会导致 SwiftUI 对视图的 body 重新求值。...在了解了两个版本的 task 修饰器的工作原理和调用机制后,为老版本的 SwiftUI 添加 task 修饰器将不再有任何困难。

    3.6K60

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

    第一轮优化:对视图 body 值进行优化 在第一轮优化中,我们会首先尝试从 SwiftUI 的角度入手。...当子视图进入惰性容器的可视区域时,SwiftUI 会调用它的 onAppear 闭包,子视图退出可视区域时,会调用 onDisappear 闭包。...开发者通常会利用这两个调用时机来实现数据准备和善后工作。...尽管我们节省了差不多 70% 的内存占用,但仍无法完全满足需求。 第二轮优化:让托管对象回归惰性状态 在第二轮优化中,我们将尝试从 Core Data 中找寻解决之道。...根据上述原理,我们将尝试如下过程: 在 onAppear 的闭包中,通过私有上下文创建一个 Picture 对象 将 data 属性的数据转换成 Image,并保存在视图中的一个 Source of truth

    2.4K40

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

    下文中,我们将对这段代码进行逐步优化,以达到最终可用的程度。 第一轮优化:对视图 body 值进行优化 在第一轮优化中,我们会首先尝试从 SwiftUI 的角度入手。...当子视图进入惰性容器的可视区域时,SwiftUI 会调用它的 onAppear 闭包,子视图退出可视区域时,会调用 onDisappear 闭包。...开发者通常会利用这两个调用时机来实现数据准备和善后工作。...尽管我们节省了差不多 70% 的内存占用,但仍无法完全满足需求。 第二轮优化:让托管对象回归惰性状态 在第二轮优化中,我们将尝试从 Core Data 中找寻解决之道。...根据上述原理,我们将尝试如下过程: 在 onAppear 的闭包中,通过私有上下文创建一个 Picture 对象 将 data 属性的数据转换成 Image,并保存在视图中的一个 Source of truth

    1.3K10

    聊一聊可组装框架( TCA )

    你可以在 SwiftUI,UIKit,以及其他框架,和任何苹果的平台( iOS、macOS、tvOS、和 watchOS )上使用 TCA。...尽管了解 TCA 的用法并不需要太多的时间,但如果开发者无法真正地掌握其内在的组装逻辑,很难写出让人满意的代码。...貌似 TCA 为开发者提供了一种从下至上的开发途径,但如果没有对完整功能进行良好地构思,到最后会发现无法组装出预想的效果。...另外,采用 WithViewStore 关注特定属性的机制在内部都是通过 Combine 来进行的。当 Reducer 的层级较多时,TCA 也需要付出不小的成本进行切分和比对的工作。...如果你是 SwiftUI 的初学者,并且对 Redux 或 Elm 也没有多少了解,可以先尝试使用一些比较轻量级的 Redux-like 框架。在对这种开发模式有了一定的熟悉后,再学习 TCA 。

    1.9K20

    如何判断 ScrollView、List 是否正在滚动中

    比如在 SwipeCell[3] 中,需要在可滚动组件开始滚动时,自动关闭已经打开的侧滑菜单。遗憾的是,SwiftUI 并没有提供这方面的 API 。...),调用此方法在 SwiftUI 中,很多的视图控件是对 UIKit( AppKit )控件的二次包装。...目前 SwiftUI 在内部的实现上去 UIKit( AppKit )化很明显,比如,本节介绍的方法在 SwiftUI 4.0 中已经失效方法二:Runloop我第一次接触 Runloop 是在学习 Combine...模式,因此无法有效地区分滚动是由那个控件造成的方法三:PreferenceKey在 SwiftUI 中,子视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey...待 SwiftUI 更多的底层实现不再依赖 UIKit( AppKit )之时,才会是它 API 的爆发期。希望本文能够对你有所帮助。

    3.8K40

    SwiftUI TextField 进阶 —— 事件、焦点、键盘

    onCommit 当用户在输入过程中按下(或点击)return键时触发 onCommit(无法通过代码模拟触发)。...即使在onAppear中,也必须要有一定延时才能让 TextField 焦点。...同其他类型的 Toolbar 类似,SwiftUI 会干预内容的排版。•无法对同一视图中多个 TextField 分别设定辅助视图在 ToolbarItem 中无法使用稍微复杂一点的判断语法。...将键盘辅助视图集成到 toolbar 的逻辑中也有些令人令人费解。 通过 UIKit 创建 当前阶段,通过 UIKit 来创建键盘辅助视图仍是 SwiftUI 下的最优方案。...相信再有 2-3 年,SwiftUI 的主要控件的原生功能就可以比肩对应的 UIKit 控件了。 关于如何对 TextField 的显示做更多的定制,之后会撰文探讨。 希望本文对你有所帮助。

    13.4K10

    iOS获取和监测设备基本信息——UIDevice的使用

    iOS获取和监测设备基本信息——UIDevice的使用 //获取当前设备单例 + (UIDevice *)currentDevice; //获取当前设备名称  @property(nonatomic,...获取电量 @property(nonatomic,readonly) float                         batteryLevel NS_AVAILABLE_IOS(3_0); 设备方向的枚举如下...//是否触发了距离传感器 @property(nonatomic,readonly)                            BOOL proximityState 相关通知: //设备方向改变时发送的通知...UIKIT_EXTERN NSString *const UIDeviceOrientationDidChangeNotification; //电池状态改变时发送的通知 UIKIT_EXTERN NSString... *const UIDeviceBatteryStateDidChangeNotification   NS_AVAILABLE_IOS(3_0); //电量改变时发送的通知 UIKIT_EXTERN

    65020

    GeometryReader :好东西还是坏东西?

    在非滚动方向上,ScrollView 会向子视图提供该维度上的全部可用尺寸。而在滚动方向上,它向子视图提供的建议尺寸为 nil。...如果我们仍然使用上文代码中的信息获取方式,那么就无法获得变更后的信息: .onAppear { width = proxy.size.width } 因此,正确的获取信息的方式为: .task...一些开发者表示,在屏幕方向发生变化时,无法获取新的信息,原因也是如此。task(id:) 同时涵盖了 onAppear 和 onChange 的场景,是最可靠的数据获取方式。...用 SwiftUI 的方式进行布局 由于对 GeometryReader 的负面看法,一些开发者会尝试寻找其他方式以避免使用它。...在处理类似需求时,我们应优先采用更符合 SwiftUI 的思维方式来考虑布局方案,而非依赖某个特定的几何数据进行计算。

    65770

    SwiftUI 与 Core Data —— 数据获取

    本文中我们将探讨在 SwiftUI 视图中批量获取 Core Data 数据的方式,并尝试创建一个可以使用 mock 数据的 FetchRequest。...我也做了不少的尝试,但最终发现似乎 FetchRequest 仍是当前 SwiftUI 中的最优解。...FetchRequest 获取 )由于 TCA 的 Reducer 无法与视图的存续期自动绑定,上面的可感知延迟在每次触发 onAppear 时都将出现最终,我决定放下心结,仍然采用在视图中使用类似...DynamicProperty 协议为数据提供了访问 SwiftUI 托管数据池的能力。通过未公开的 _makeProperty 方法,数据可以在 SwiftUI 数据池中申请空间进行保存并读取。...如此一来,在将视图提取到一个单独的 Package 时,仍需导入包含具体 Core Data 托管对象定义的库,无法做到完全的解耦。

    4.7K30

    iOS学习——获取iOS设备的各种信息

    1.2 UIDevice中对状态信息的监控   UIDevice中对设备的方向、电池状态、电量以及距离传感器等信息都能进行获取,有时候我们需要对相应的状态进行监控,以便在状态发生改变时我们采取相应的措施...//设备方向改变时发送的通知 UIKIT_EXTERN NSString *const UIDeviceOrientationDidChangeNotification; //电池状态改变时发送的通知...UIKIT_EXTERN NSString *const UIDeviceBatteryStateDidChangeNotification NS_AVAILABLE_IOS(3_0); //电量改变时发送的通知...UIKIT_EXTERN NSString *const UIDeviceProximityStateDidChangeNotification NS_AVAILABLE_IOS(3_0); 其中,设备方向的枚举选项有以下几种...,这是用方法控制 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; //不需要时可以关闭设备方向监控

    3.4K71
    领券