在视图控制器中创建可发布的属性,将其传递给SwiftUI视图并侦听视图控制器内的更改?

在视图控制器中创建可发布的属性,将其传递给SwiftUI视图并侦听视图控制器内的更改?,swiftui,combine,Swiftui,Combine,这就是我努力实现的目标: class MyVC: UIViewController { @State var myBoolState: Bool = false private var subscribers = Set<AnyCancellable>() override func viewDidLoad() { super.viewDidLoad() myBoolState.sink { value in .... }

这就是我努力实现的目标:

class MyVC: UIViewController {
    @State var myBoolState: Bool = false

    private var subscribers = Set<AnyCancellable>()

    override func viewDidLoad() {
        super.viewDidLoad()

        myBoolState.sink { value in .... }.store(in:&subscribers)
    }

    func createTheView() {
        let vc = UIHostingController(rootView: MySwiftUIView(myBoolState: $myBoolState))
        self.navigationController!.pushViewController(vc, animated: true)
    }
}

struct MySwiftUIView: View {
    @Binding var myBoolState: Bool

    var body: some View {
          Button(action: {
              myBoolState = true
          }) {
              Text("Push Me")
          }

    }

}
类MyVC:UIViewController{
@状态变量myBoolState:Bool=false
private var subscribers=Set()
重写func viewDidLoad(){
super.viewDidLoad()
myBoolState.sink{value in..}.store(in:&订阅服务器)
}
func createTheView(){
让vc=UIHostingController(rootView:myswituiview(myBoolState:$myBoolState))
self.navigationController!.pushViewController(vc,动画:true)
}
}
结构myswituiview:View{
@绑定变量myBoolState:Bool
var body:一些观点{
按钮(操作:{
myBoolState=true
}) {
文本(“推我”)
}
}
}
但上述内容当然无法编译


所以问题是:我是否可以在视图控制器中声明一个已发布的属性,将其传递给SwiftUI视图,并在SwiftUI视图更改其值时得到通知?

@State
包装器仅在SwiftUI视图中工作(按设计),因此不能在视图控制器中使用它。相反,有用于此目的的
ObsevableObject/ObsevableObject
模式,因为它基于引用类型

以下是针对您的场景的可能解决方案的演示:

import Combine

class ViewModel: ObservableObject {
    @Published var myBoolState: Bool = false
}

class MyVC: UIViewController {
    let vm = ViewModel()
    
    private var subscribers = Set<AnyCancellable>()

    override func viewDidLoad() {
        super.viewDidLoad()

        vm.$myBoolState.sink { value in
            print(">> here it goes")
        }.store(in:&subscribers)
    }

    func createTheView() {
        let vc = UIHostingController(rootView: MySwiftUIView(vm: self.vm))
        self.navigationController!.pushViewController(vc, animated: true)
    }
}

struct MySwiftUIView: View {
    @ObservedObject var vm: ViewModel

    var body: some View {
          Button(action: {
            vm.myBoolState = true
          }) {
              Text("Push Me")
          }
    }
}
导入联合收割机
类ViewModel:ObservableObject{
@已发布的变量myBoolState:Bool=false
}
类MyVC:UIViewController{
让vm=ViewModel()
private var subscribers=Set()
重写func viewDidLoad(){
super.viewDidLoad()
vm.$myBoolState.sink{中的值
打印(“>>在这里”)
}.store(位于订阅服务器(&S)
}
func createTheView(){
让vc=UIHostingController(rootView:myswituiview(vm:self.vm))
self.navigationController!.pushViewController(vc,动画:true)
}
}
结构myswituiview:View{
@观察对象变量vm:ViewModel
var body:一些观点{
按钮(操作:{
vm.myBoolState=true
}) {
文本(“推我”)
}
}
}

Ah,不确定是否要在SwiftUI外部使用ObservableObject。当我回到编码的时候,我会试试的。这很有效。我为此创建了一个简单的泛型类:类observevariable:observeObject{@Published var value:T init(val:T){self.value=val}