Как получить доступ к элементам представления контента позже в SwiftUI? - PullRequest
0 голосов
/ 04 октября 2019

Допустим, у меня есть представление содержимого, подобное этому:

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 Ответ

2 голосов
/ 04 октября 2019

Вы, вероятно, должны пересмотреть свой подход. Что именно вы хотите, чтобы произошло? У вас есть какой-то внешний тип модели данных, который извлекает (или обновляет) данные, и вы хотите, чтобы ваши представления реагировали на это? Если это так, создайте 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, вы можете использовать систему Preferences в SwiftUI. Это более сложная тема, поэтому я просто укажу на полезный ресурс, который я нашел здесь: https://swiftui -lab.com / communication-with-the-view-tree-part-1 /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...