Skip to content

Instantly share code, notes, and snippets.

@b3ll
Created November 15, 2019 01:35
Show Gist options
  • Select an option

  • Save b3ll/4a2c44217a89111fb49002110b738f76 to your computer and use it in GitHub Desktop.

Select an option

Save b3ll/4a2c44217a89111fb49002110b738f76 to your computer and use it in GitHub Desktop.
ModelBoundViewWrapper.swift
//: A UIKit based Playground for presenting user interface
import SwiftUI
import UIKit
import PlaygroundSupport
public struct ObservedObjectWrapperView<Content: View, Model: ObservableObject>: View {
@ObservedObject public var model: Model
public let content: (ObservedObject<Model>.Wrapper) -> Content
public init (model: Model, content: @escaping (ObservedObject<Model>.Wrapper) -> Content) {
self.model = model
self.content = content
}
public var body: some View {
content($model)
}
}
class SynthModel: ObservableObject {
@Published var volume: Float = 0.5 {
didSet {
print("\(volume)")
}
}
func view<Content: View>(content: @escaping (ObservedObject<SynthModel>.Wrapper) -> Content) -> ObservedObjectWrapperView<Content, SynthModel> {
return ObservedObjectWrapperView(model: self, content: content)
}
}
struct VolumeKnob: View {
@Binding var volume: Float
var body: some View {
return Slider(value: _volume)
}
}
var synthModel = SynthModel()
let volumeKnobViewController = UIHostingController(rootView: synthModel.view { VolumeKnob(volume: $0.volume) })
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = volumeKnobViewController
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment