Skip to content

Instantly share code, notes, and snippets.

@pookjw
Created May 23, 2024 09:40
Show Gist options
  • Save pookjw/8327f7ac887a79e9d2b5baee135039d2 to your computer and use it in GitHub Desktop.
Save pookjw/8327f7ac887a79e9d2b5baee135039d2 to your computer and use it in GitHub Desktop.
import UIKit
import SwiftUI
struct MyView: View {
@State var number: Int = .zero
var body: some View {
MyViewController.SwiftUIView(number: $number)
}
}
final class MyViewController: UIViewController {
protocol Delegate: AnyObject {
func set(number: Int)
}
var number: Int {
didSet {
guard oldValue != number else { return }
}
}
weak var delegate: Delegate?
init(number: Int) {
self.number = number
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func increment() {
number += 1
delegate?.set(number: number)
}
}
extension MyViewController {
struct SwiftUIView: UIViewControllerRepresentable {
@Binding var number: Int
func makeUIViewController(context: Context) -> MyViewController {
let vc = MyViewController(number: number)
vc.delegate = context.coordinator
return vc
}
func updateUIViewController(_ uiViewController: MyViewController, context: Context) {
context.coordinator.number = _number
uiViewController.delegate = context.coordinator
uiViewController.number = number
}
func makeCoordinator() -> Coordinator {
.init(number: $number)
}
final class Coordinator: Delegate {
var number: Binding<Int>
init(number: Binding<Int>) {
self.number = number
}
func set(number: Int) {
self.number.wrappedValue = number
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment