【问题标题】:How to keep reference to a child view with Binding inside the parent view?如何在父视图中保持对子视图的引用?
【发布时间】:2020-11-15 09:34:03
【问题描述】:

在一个父 SwiftUI 视图中,我需要保持对作为 UIViewRepresentable 的子视图的引用。为此,我在父级初始化期间创建了一个子视图的实例,并将其分配给一个属性。这很好用。

struct parentView: View {
    var childView: ChildView

    init() {
        self.childView = ChildView()
    }

    var body: some View {
        childView
    }
}

我的问题是当子视图需要一些绑定作为参数时。由于绑定尚未初始化,Xcode 会引发错误。我该如何解决?

struct parentView: View {
    @State private var property1: Bool = false
    var childView: ChildView

    init() {
        self.childView = ChildView(property1: $property1)
    }

    var body: some View {
        childView
    }
}

struct ChildView: UIViewRepresentable {
    @Binding var property1: Bool

    // code
}

或者可能是我错了,除了保持对它们的引用之外,还有其他解决方案可以直接访问子视图的功能。

【问题讨论】:

  • SwiftUI 视图不是引用类型,它是 struct - value,你不能一直引用它。
  • 为什么您需要保留对子视图的引用
  • 大家好,我知道 SwiftUI 不是引用类型,但在某些特定情况下仍然需要它。在我的例子中,UIViewRepresentable 是一个 Mapbox 地图,并且这个视图有一些特定的方法不用于设置/绘制视图,比如转换 CGPoint 中的坐标。我的父视图使用它来执行一些操作。
  • 您应该了解如何重构代码。将视图与模型分开,以便视图是一次性的。
  • @Paulw11,我不知道该怎么做......你有什么想法吗?

标签: ios swift swiftui


【解决方案1】:

终于在 Kavsoft 的 YouTube 视频中找到了一个不错的解决方案:

struct parentView: View {
    @State private var property1: Bool = false
    var uiView = UIViewClass()

    var body: some View {
        VStack {
            childView(uiView: $uiView, property1: $property1)
            Button("Direct action to uiView") {
                uiView.action()
                let returnString = uiView.actionReturningString()
            }
        }
    }
}

struct ChildView: UIViewRepresentable {
    @Binding var uiView: UIViewClass
    @Binding var property1: Bool

    // UIViewRepresentable protocol
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多