从 SwiftUI 组件获取并自定义 UIKit/Cocoa 对象。
例如,Slider 内部使用 UISlider。因此,可以通过直接引用 UISlider 对象进行自定义,如下所示。
Slider(value: $value)
.cocoa { slider in // UISider
slider.setThumbImage(.init(systemName: "swift"), for: .normal)
}
对于遵循名为 DefaultCocoaViewBridging 协议的组件,您可以按如下方式获取 UIKit/Cocoa 对象。DefaultCocoaViewBridging 从 SwiftUI.View 获取 UIView 对象。相比之下,DefaultCocoaControllerBridging 获取 UIViewController 对象。
CocoaBriding 协议定义了 DefaultCocoaType。 例如,对于 Toggle,DefaultCocoaType 是 UISwitch(iOS)。 可以按如下方式处理
Toggle("Hello", isOn: .constant(true))
.cocoa { `switch` in
`switch`.onTintColor = .red
}
但是,如果 ToggleStyle 设置为 Button,则内部使用 UIButton 而不是 UISwitch。 对于这种情况,也可以通过指定类型来检索数据,如下所示。
Toggle("Hello", isOn: .constant(true))
.cocoa(for: UIButton.self) { button in
button.layer.borderWidth = 1
}
指定类型的方法在 SwiftUI.View 中定义,不需要遵循 DefaultCocoaViewBridging 或 DefaultCocoaControllerBridging 协议。 如果未找到指定的类型,则不会调用闭包。
extension XXView: DefaultCocoaViewBridging { // confirms `DefaultCocoaViewBridging`
public typealias DefaultCocoaViewType = XXCocoaView // UIKit/Cocoa type
}
extension YYView: DefaultCocoaViewControllerBridging { // confirms `DefaultCocoaViewControllerBridging`
public typealias DefaultCocoaControllerType = YYCocoaViewController // UIKit/Cocoa type
}
在某些 View 生命周期事件中,提供了一个修饰符来检索获得的 UIKit/Cocoa 对象。 例如,以下代码在 push 时隐藏 tabBar,并在 pop 时重新显示它。
TabView {
NavigationView {
List(0..<100) { i in
NavigationLink {
Text("Detail: \(i)")
.cocoa(for: CocoaViewController.self) { vc in
print(vc)
}
.onViewWillAppear { vc in
// Hide TabBar
vc?.tabBarController?.tabBar.isHidden = true
}
.onViewWillDisappear { vc in
// Show TabBar
vc?.tabBarController?.tabBar.isHidden = false
}
} label: {
Text("Row: \(i)")
}
}
}
}
以下修饰符可用。
这可能会因操作系统和使用条件而异。
| SwiftUI | 样式 | UIKit(iOS) | Cocoa(macOS) | UIKit(tvOS) |
|---|---|---|---|---|
| ScrollView | - | UIScrollView | NSScrollView | UIScrollView |
| List | - | UICollectionView(>=iOS16) UITableView(<iOS16) | NSTableView | UITableView |
| Form | - | UICollectionView(>=iOS16) UITableView(<iOS16) | ? | UITableView |
| TextField | - | UITextField | NSTextField | UITextField |
| SecureField | - | UITextField | NSTextField | UITextField |
| Slider | - | UISlider | NSSlider | - |
| Stepper | - | UIStepper | NSStepper | - |
| Picker | Wheel | UIPickerView | NSButton | - |
| Inline | UIPickerView | ? | UISegmentedControl | |
| Segmented | UISegmentedControl | NSSegmentedControl | UISegmentedControl | |
| Menu | ? | NSButton | - | |
| DatePicker | - | UIDatePicker | NSDatePicker | - |
| MultiDatePicker | - | UICalendarView | - | - |
| ColorPicker | - | UIColorWell | NSColorWell | - |
| Toggle | .switch | UISwitch | NSSwitch | - |
| .button | UIButton | NSButton | - | |
| .checkbox | - | NSButton | - | |
| TextEditor | - | UITextView | NSTextView | - |
| Button | - | - | NSButton | - |
| ProgressView | .linear | UIProgressView | NSProgressIndicator | UIProgressView |
| .circular | UIActivityIndicatorView | NSProgressIndicator | UIActivityIndicatorView | |
| TabView | - | UITabBarController | NSTabView | UITabBarController |
| NavigationView | DoubleColumn | UISplitViewController | NSSplitView | - |
| Stack | UINavigationController | - | UINavigationController | |
| NavigationStack | - | UINavigationController | ? | UINavigationController |
| NavgationSplitView | - | UISplitViewController | NSSplitView | - |