SwiftUI中Preferences的使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwiftUI中Preferences的使用相关的知识,希望对你有一定的参考价值。
参考技术A使用 preferences 时,需要声明一个遵守 PreferenceKey 协议的 Struct , PreferenceKey 协议有二个必要的实现,一个是 defaultValue 默认值,另外一个是 reduce 方法。
reduce 方法在 Swift 中非常常见,这里的用处是当有多个子 View 都给父 View 传递数据时,父 View 最后是只能接受一个数据,而 reduce 就是将子 View 提供的多个数据进行“操作”,降维为一个数据提供给父 View 使用, PreferenceKey 的 reduce 方法包含两个参数:当前的 value ,和下一个要合并的值 nextValue ,这二个参数是子 View 从上到下提供的。
这里述说一下完整的布局流程:
1. MainButtonView 在将屏幕宽度扣除掉左右2个方向的 padding=20 后,将这个剩下的宽度尺寸和整个屏幕高度尺寸作为提议,向外层的 HStack 请求尺寸。
2.紧接着外层的 HStack 会继续像内层的 ZStack 请求尺寸, ZStack 会继续像内层的二个 HStack 请求尺寸,此时 ZStack 提议给内层的尺寸依旧是上述1中的提议尺寸。
3.由于是 ZStack ,内存的 HStack1 和 HStack2 会拿着提议尺寸继续找自己的子 View 请求尺寸。
4. HStack1 内的 Text 会首先尊重提议的宽度尺寸,并根据是否换行或者省略的方式来显示自己,由于此时 HStack1 提议的宽度尺寸较大,此时 Text 会根据显示的文字将 实际的宽度和高度 反馈给 HStack1 ,这样 HStack1 就确定了自己的尺寸。
5. HStack1 确定了自己的尺寸后, Text 通过 GeometryReader 拿到了 HStack1 确定好的尺寸,并通过 SizeKey 告诉期上面的给父 View 。
6.由于 ZStack 调用了 onPreferenceChange 方法,这样 ZStack 就获得了 HStack1 的尺寸,并赋值给了 height 变量, SwiftUI 此时会刷新整个 View ,下面的 HStack2 内的布局和上面 HStack1 差不多,只不多此时 Image 的宽高已有了指定的尺寸( Text 的高度)。
7.确定好尺寸的 HStack1 和 HStack2 将自己的尺寸上报给 ZStack , ZStack 确定好尺寸在上报给外层 HStack ,这样整个 MainButtonView 就完成了尺寸布局。
以上是关于SwiftUI中Preferences的使用的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:子块正在初始化,但数据尚未存储在 shared_preferences 中
使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?
SwiftUI:PreferenceKey Reduce 方法永远不会被调用
无法在此文件中预览 - SwiftUI Testing.app 可能已崩溃