首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ViewController上设置UIViewControllerRepresentable属性

在ViewController上设置UIViewControllerRepresentable属性
EN

Stack Overflow用户
提问于 2020-07-16 11:56:24
回答 2查看 306关注 0票数 2

如何更改UIViewController上的属性。一个UIViewControllerRepresentable

我期望它如何工作的示例代码,但是它不工作。我如何使它工作?

(颜色只是一个例子,请不要专注于此)

代码语言:javascript
复制
class MyViewController: UIViewController {
    var color: UIColor? = nil {
        didSet {
            guard isViewLoaded else { return }
            view.layer.backgroundColor = color?.cgColor
        }
    }

    override func viewDidLoad() {
        view.layer.backgroundColor = color?.cgColor
    }
}

struct MyView: UIViewControllerRepresentable {
    @State private var color: UIColor?

    func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
        let viewController = MyViewController()
        viewController.color = color // always nil?
        return viewController
    }


    func updateUIViewController(_ uiViewController: MyViewController,
                                context: UIViewControllerRepresentableContext<MyView>) {
        uiViewController.color = color // always nil?
    }
}

extension MyView {
    func color(_ color: UIColor) -> MyView {
        self.color = color // does nothing?
        return self
    }
}

struct ContentView: View {
    var body: some View {
        MyView()
            .color(.magenta)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-16 12:14:50

这是一种可能的方法(如果您期望颜色可以从外部修改,正如所看到的那样)。用Xcode 11.4 / iOS 13.4测试

代码语言:javascript
复制
struct MyView: UIViewControllerRepresentable {
    @Binding var color: UIColor?

    func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
        let viewController = MyViewController()
        viewController.color = color // always nil?
        return viewController
    }


    func updateUIViewController(_ uiViewController: MyViewController,
                                context: UIViewControllerRepresentableContext<MyView>) {
        uiViewController.color = color // always nil?
    }
}

struct ContentView: View {
    @State private var color: UIColor? = .magenta

    var body: some View {
        MyView(color: $color)
//        MyView(color: .constant(.magenta)) // alternate usage
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-07-16 12:27:34

另一种基于Asperi回答的想法的解决方案:

代码语言:javascript
复制
struct MyView: UIViewControllerRepresentable {
    private class State: ObservableObject {
        var color: UIColor?
    }

    @Binding private var state: State

    init() {
        _state = .constant(State())
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
        return MyViewController()
    }

    func updateUIViewController(_ uiViewController: MyViewController,
                                context: UIViewControllerRepresentableContext<MyView>) {
        uiViewController.color = state.color
    }
}

extension MyView {
    func color(_ color: UIColor) -> MyView {
        self.state.color = color
        return self
    }
}

或者更简单的版本,我们只对包装好的ViewController直接使用@Binding

代码语言:javascript
复制
struct MyView: UIViewControllerRepresentable {
    @Binding private var viewController: MyViewController

    init() {
        _viewController = .constant(MyViewController())
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
        return viewController
    }

    func updateUIViewController(_ uiViewController: MyViewController,
                                context: UIViewControllerRepresentableContext<MyView>) {
    }
}

extension MyView {
    func color(_ color: UIColor) -> MyView {
        self.viewController.color = color
        return self
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62934158

复制
相关文章

相似问题

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