首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将@Published属性从视图控制器传递到SwiftUI

将@Published属性从视图控制器传递到SwiftUI
EN

Stack Overflow用户
提问于 2020-10-15 00:13:21
回答 1查看 243关注 0票数 1

假设您有一个遗留的视图控制器,我想在SwiftUI中使用它。视图控制器有一个@Published属性,该属性包含它的当前状态:

代码语言:javascript
复制
class LegacyViewController: UIViewController {
    enum State {
        case opened
        case closed
        case halfOpened
    }
    
    @Published var state: State
    
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        self.state = .closed
        super.init(nibName: nil, bundle: nil)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // state is changed after some time
    }
}

理想情况下,我希望在SwiftUI中使用它,如下所示:

代码语言:javascript
复制
struct ContentView: View {
    @State var state: LegacyViewController.State
    
    var body: some View {
        VCWrapper(state: $state).overlay (
            Text("\(state)")
        )
    }
}

这意味着我需要实现UIViewControllerRepresentable协议:

代码语言:javascript
复制
struct VCWrapper: UIViewControllerRepresentable {
    @Binding var state: LegacyViewController.State
    
    func makeUIViewController(context: Context) -> LegacyViewController {
        let vc = LegacyViewController(nibName: nil, bundle: nil)
        /// where to perform the actual binding?
        return vc
    }
    
    func updateUIViewController(_ uiViewController: LegacyViewController, context: Context) {
        
    }
}

但是,我在找出从LegacyViewControllerstate属性到VCWrapper公开的state属性的实际绑定位置时遇到了麻烦。如果LegacyViewController公开了一个委托,我可以通过Coordinator对象实现绑定,但考虑到我没有使用委托对象,我不确定如何做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-15 00:51:12

以下是可能的解决方案--使用Combine。使用Xcode12/ iOS 14进行了测试。

代码语言:javascript
复制
import Combine

struct VCWrapper: UIViewControllerRepresentable {
    @Binding var state: LegacyViewController.State
    
    func makeUIViewController(context: Context) -> LegacyViewController {
        let vc = LegacyViewController(nibName: nil, bundle: nil)

        // subscribe to controller state publisher and update bound
        // external state
        context.coordinator.cancelable = vc.$state
            .sink {
               DispatchQueue.main.async {
                  _state.wrappedValue = $0
               }
            }

        return vc
    }
    
    func updateUIViewController(_ uiViewController: LegacyViewController, context: Context) {
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
    class Coordinator {
        var cancelable: AnyCancellable?
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64357436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档