在视图控制器中创建可发布的属性,将其传递给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}