Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在UIViewControllerRepresentable中设置ViewController的属性_Swift_Swiftui - Fatal编程技术网

Swift 在UIViewControllerRepresentable中设置ViewController的属性

Swift 在UIViewControllerRepresentable中设置ViewController的属性,swift,swiftui,Swift,Swiftui,如何更改通过显示的UIViewController上的属性。aUIViewControllerRepresentable 我希望它如何工作的示例代码,但是它没有。我怎样才能让它工作 (颜色只是一个例子,请不要关注这个) 类MyViewController:UIViewController{ 变量颜色:UIColor?=nil{ 迪塞特{ guard isViewLoaded else{return} view.layer.backgroundColor=颜色?.cgColor } } 重写fun

如何更改通过显示的
UIViewController
上的属性。a
UIViewControllerRepresentable

我希望它如何工作的示例代码,但是它没有。我怎样才能让它工作

(颜色只是一个例子,请不要关注这个)

类MyViewController:UIViewController{
变量颜色:UIColor?=nil{
迪塞特{
guard isViewLoaded else{return}
view.layer.backgroundColor=颜色?.cgColor
}
}
重写func viewDidLoad(){
view.layer.backgroundColor=颜色?.cgColor
}
}
结构MyView:UIViewControllerRepresentable{
@国家私有var颜色:UIColor?
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->MyViewController{
让viewController=MyViewController()
viewController.color=color//是否始终为零?
返回视图控制器
}
func updateUIViewController(uUIViewController:MyViewController,
上下文:UIViewControllerRepresentableContext){
uiViewController.color=color//是否始终为零?
}
}
扩展MyView{
func color(color:UIColor)->MyView{
self.color=color//什么都不做?
回归自我
}
}
结构ContentView:View{
var body:一些观点{
MyView()
.颜色(.洋红)
}
}
这里是一种可能的方法(如果您希望颜色可以从外部修改,正如所见)。使用Xcode 11.4/iOS 13.4进行测试

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
    }
}
struct MyView:UIViewControllerRepresentable{
@绑定变量颜色:UIColor?
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->MyViewController{
让viewController=MyViewController()
viewController.color=color//是否始终为零?
返回视图控制器
}
func updateUIViewController(uUIViewController:MyViewController,
上下文:UIViewControllerRepresentableContext){
uiViewController.color=color//是否始终为零?
}
}
结构ContentView:View{
@国家私有var颜色:UIColor?=.PIGENTA
var body:一些观点{
MyView(颜色:$color)
//MyView(颜色:。常量(.洋红))//其他用法
}
}

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

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
    }
}

唉,这种方法需要在视图构造函数中初始化所有绑定。如果有多个绑定/属性,那将非常糟糕。如果可能的话,我真的很想避免这种情况。@ClausJørgensen,如果你想让它在
updateUIViewController
中可更新,你需要绑定或某种ObservedObject的变体。啊,这给了我一个主意。我可以为我想要的任何属性(视图状态)添加一个中间ObservedObject,并将其作为私有常量绑定,同时从函数更新该状态。
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
    }
}
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
    }
}