主要观点:在之前关于 SwiftUI 中使用偏好的文章基础上,此篇重点介绍聚焦值(FocusedValues)。聚焦值系统类似偏好,其归约函数是“源自聚焦视图的值获胜”,对于熟悉 AppKit 或 UIKit 的人来说,可将其视为响应者链的强类型通用版本。
关键信息:
- 聚焦值声明类似环境值,有键类型和计算属性或
@Entry
宏,其属性类型需为可选,默认值为nil
。 - 用
.focusedValue
修饰符将实际值附加到视图,该修饰符可应用于子视图等,读取聚焦值使用@FocusedValue
属性包装器。 - 可利用聚焦值实现菜单命令的启用状态依赖于当前编辑对象数据等功能,还能将动作放入聚焦值中,甚至可用于偷偷访问平台视图。
重要细节:
- 例如通过
TextField
和.focusedValue(\.myValue, 42)
,当TextField
有焦点时,值 42 会写入myValue
键。 - 在
MyCommands
中,通过@FocusedValue(\.myCommandEnabled)
读取聚焦值来控制菜单命令的启用状态。 - 在
MyCommands
中,将动作放入聚焦值,如@FocusedValue(\.myAction)
,并在按钮中使用。 - 在 Tusker 的 Compose 屏幕中,利用聚焦值持有
UITextField
/UITextView
的引用,实现自定义 emoji 选择器等功能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。