Как с помощью SwiftUI сделать представление обернутым обновлением свойства State - PullRequest
0 голосов
/ 18 июня 2020

Приведенный ниже код создает простой HStack, который в конечном итоге выглядит следующим образом: preview

Проблема в том, что нажатие «increment» увеличивает «Count», но не «Nested. ". Кто-нибудь знает, почему это так и, возможно, как это исправить? Или представления SwiftUI просто фундаментально ломаются, когда они вложены в переменную State?

struct ContentView: View {
  var body: some View {
    VStack {
      Text("Count: \(count)")
      nested
      Button(action: {
        self.count += 1
        self.nested.count += 1
      }) { Text("Increment") }
    }
  }
  @State var count = 0

  struct Nested: View {
    var body: some View {
      Text("Nested: \(count)")
    }
    @State var count = 0
  }
  @State var nested = Nested()
}

1 Ответ

0 голосов
/ 18 июня 2020

SwiftUI был разработан для «вложения» представлений, но вы используете его не по назначению. Переменные состояния предназначены для данных, принадлежащих представлению, а вложенное представление (или, по крайней мере, обычно) не предназначено для данных, принадлежащих представлению, поэтому это не обязательно должна быть переменная состояния.

Вместо этого вы можете просто использовать переменную count в качестве параметра для представления Nested, и каждый раз, когда переменная состояния count изменяется в родительском элементе, ее тело будет повторно отображено:

struct ContentView: View {
  var body: some View {
    VStack {
      Text("Count: \(count)")

      Nested(count: count) // pass the count as an init param

      Button(action: {
        self.count += 1
        self.nested.count += 1
      }) { Text("Increment") }
    }
  }

  @State var count = 0

  struct Nested: View {
    var body: some View {
      Text("Nested: \(count)")
    }
    var count: Int
  }
}
...