Obtain and customize UIKit/Cocoa objects from SwiftUI components

CocoaUI

Obtain and customize UIKit/Cocoa objects from SwiftUI components.

Demo

For example, Slider uses UISlider internally. Therefore, it can be customized by directly referencing the UISlider object as follows.

 Slider(value: $value)
    .cocoa { slider in // UISider
        slider.setThumbImage(.init(systemName: "swift"), for: .normal)
    }

Document

For components conforming to the protocol named CocoaViewBridging, you can get UIKit/Cocoa objects as follows. The CocoaBriding protocol defines a DefaultCocoaType.   For example, for Toggle, the DefaultCocoaType is UISwitch(iOS).   It can be handled as follows

 Toggle("Hello", isOn: .constant(true))
    .cocoa { `switch` in
        `switch`.onTintColor = .red
    }

Specify type

However, if the ToggleStyle is set to Button, UIButton is used internally instead of UISwitch. For such cases, it is also possible to retrieve the data by specifying the type as follows.

Toggle("Hello", isOn: .constant(true))
    .cocoa(for: UIButton.self) { button in
       button.layer.borderWidth = 1
    }

If the specified type is not found, the closure will not be called.

Support additional component

extension XXView: CocoaViewBridging { // confirms `CocoaViewBridging`
    public typealias DefaultCocoaType = XXCocoaView // UIKit/Cocoa type
}

SwiftUI and Cocoa correspondence table

This may vary depending on the operating system and usage conditions.

SwiftUI style UIKit Cocoa
ScrollView UIScrollView NSScrollView
List UICollectionView(>=iOS16) UITableView(<iOS16) NSTableView
TextField UITextField NSTextField
Slider UISlider NSSlider
Stepper UIStepper NSStepper
Picker Wheel UIPickerView NSButton
Inline UIPickerView ?
Segmented UISegmentedControl NSSegmentedControl
Menu ? NSButton
DatePicker UIDatePicker NSDatePicker
ColorPicker UIColorWell NSColorWell
Toggle .switch UISwitch NSSwitch
.button UIButton NSButton
.checkbox NSButton
TextEditor UITextView NSTextView
Button NSButton
TabView UITabBarController NSTabView
NavigationView DoubleColumn UISplitViewController NSSplitView
Stack UINavigationController
NavigationStack UINavigationController ?
NavgationSplitView UISplitViewController NSSplitView

GitHub

View Github