Inspect 是一种从 SwiftUI 中更安全、更 Swift 地访问 UIKit 和 AppKit 组件的新方法。它深受 SwiftUI-Introspect
的启发,但未使用任何旧代码。
SwiftUI | UIKit | AppKit | 注意 |
---|---|---|---|
TextField (文本框) | UITextField | NSTextField | |
TextEditor (文本编辑器) | UITextEditor | NSTextView | |
ScrollView (滚动视图) | UIScrollView | NSScrollView | |
List/Form (列表/表单) | ListInspectionNativeView* | NSTableView | |
any View (任何视图) | ListCellInspectionNativeView* | 尚未实现 | 可以在代表 List 或 Form Cell (单元格) 的任何视图上调用此方法。该函数名为 inspectListOrFormCell 。 |
Button (按钮) | 没有原生控件 | NSButton | |
Toggle (开关) | UISwitch | NSButton | |
Slider (滑块) | UISlider | NSSlider | |
Stepper (步进器) | UIStepper | NSStepper | |
DatePicker (日期选择器) | UIDatePicker | NSDatePicker | |
Picker (选择器) | UISegmentedControl | NSSegmentedControl | 目前仅支持 PickerStyle.segmentedControl 样式,因此该方法名为 inspectSegmentedControl 。 |
ColorPicker (颜色选择器) | UIColorWell | NSColorWell | |
NavigationView / NavigationStack (导航视图/导航栈) | UINavigationController / UISplitViewController / UINavigationBar | 没有相关的原生控件 | 默认函数 inspect 返回一个 UINavigationController 。UISplitViewController 可通过 inspectSplitViewController 访问,UINavigationBar 可通过 inspectNavigationBar 访问。 |
TabView (标签栏视图) | UITabBarController / UITabBar | 没有相关的原生控件 | 默认函数 inspect 返回一个 UITabBarController 。UITabBar 可通过 inspectTabBar 访问。 |
*在 iOS 上,根据环境和操作系统版本,List
和 Form
可以是 UITableView
和 UICollectionView
,因此它们的子视图可以是 UITableViewCell
或 UICollectionViewCell
。ListInspectionNativeView
和 ListCellInspectionNativeView
是枚举,它们包含找到的视图作为关联值(例如 ListInspectionNativeView.tableView(UITableView)
)。在大多数情况下,您应该同时支持这两种情况。
Inspect 和 Introspect 之间最大的区别是
InspectionView
的父视图的子视图),而是遍历视图层次结构的各个层级,直到找到正确的视图。它通过将 InspectionView
的框架与任何潜在结果候选者的框架进行匹配来实现。TextField
上调用 inspect()
并获得一个 UITextField
。您不能调用 inspect()
在任何其他 SwiftUI 类型上检索 UITextField
,甚至在修改过的 TextField
上也不行。这不适用于 UITableViewCell
或 UICollectionViewCell
,它们没有对应的 SwiftUI 类型。Inspect 的工作原理是将 InspectionView
作为背景视图添加到视图层次结构中。然后,它查找一个具有与 InspectionView
相同的全局框架并且是您要查找的类型的视图。在某些情况下,当查找的框架与 InspectionView
的框架不同时,情况会稍微复杂一些,但您可以通过查看代码找到所有这些。
请注意,此内省方法可能会在未来的 SwiftUI 版本中失效。未来的实现可能不会使用正在查找的 UIKit 元素。虽然该库不太可能崩溃,但在这些情况下不会调用 .inspect()
方法。
Inspect
可以在生产环境中使用,并遵循一些操作规则
TextField("Placeholder", text: $textValue)
.inspect { field in
field.layer.backgroundColor = UIColor.red.cgColor
}
https://github.com/quintschaf/SwiftUI-Inspect.git
.segmentedControl
之外的更多 Picker
样式,可能使用枚举返回(如 List)特别感谢 Siteline、Loïs Di Qual 以及 SwiftUI-Introspect
的所有其他贡献者,感谢他们的诸多启发。