假设我有一个这样的内容视图:
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中有等效的东西吗?
答案 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/