稍后如何在SwiftUI中访问内容视图的元素?

时间:2019-10-04 15:25:08

标签: swift swiftui

假设我有一个这样的内容视图:

struct ContentView: View {
    @State private var selection = 0

    var body: some View {
        TabView(selection: $selection) {
            CustomClass()
                .tabItem {
                    VStack {
                        Image("First")
                        Text("First")
                    }
                }
                .tag(0)
            Button(action: { EmployeeStorage.sharedInstance.reload() }) {
                Text("Reload")
            }
                .tabItem {
                    VStack {
                        Image("Second")
                        Text("Second")
                    }
                }
                .tag(1)
        }
    }
}

// MARK: - SomeDelegateThatUpdatesMeLater
extension ContentView: SomeDelegateThatUpdatesMeLater {
    func callback() {
        // Here I want to update my content view's subviews
        // The ContentClass instance needs to be updated
    }
}

假设我要侦听回调方法,然后稍后再更新内容视图的选项卡编号1(CustomClass)。如何访问内容视图的子视图?我需要类似UIKit的 subviewWithTag(_:)。 SwiftUI中有等效的东西吗?

1 个答案:

答案 0 :(得分:2)

您可能应该重新考虑您的方法。您到底想发生什么?您有某种外部数据模型类型可以获取(或更新)数据,并且您希望视图对此做出反应?如果是这种情况,请创建一个ObservableObject并将其传递给您的CustomClass

struct CustomClass: View {

   @ObservedObject var model: Model

   var body: some View {
      // base your view on your observed-object
   }
}

也许您想收到来自CustomClass的事件的通知吗?

struct CustomClass: View {

  var onButtonPress: () -> Void = { }

  var body: some View {
    Button("Press me") { self.onButtonPress() }
  }
}

struct ParentView: View {

  var body: some View { 
    CustomClass(onButtonPress: { /* react to the press here */ })
  }
}

最后,如果您确实希望在视图中使用某种tag,则可以利用SwiftUI中的Preferences系统。这是一个更复杂的主题,因此我在这里仅指出我发现是非常有用的资源: https://swiftui-lab.com/communicating-with-the-view-tree-part-1/