SwiftUI: перерисовка после передачи данных Dynami c в представление содержимого - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть что-то похожее ниже, за исключением того, что у меня есть дополнительные динамические жесты c внутри "ChildContentView".

Как заставить принудительно перерисовать / перезагрузить дочернее представление? В настоящее время любой динамический c контент dr aws один раз и не перезагружается. Весь контент по существу c.

Обновление: необходимо использовать let content: () -> Content вместо @State var content: () -> Content.

// ChildContentView
struct ChildContentView<Content: View>: View {
    @State var content: () -> Content

    var body: some View {
        let dragGesture = DragGesture()...

        return Group {
            self.content()
        }.gesture(dragGesture)
    }
}
// ContentView
...
@State var changingList: [FooItem] = [] <-- This is dynamically changed.  Not reflected in this code snippet.

var body: some View {
    ZStack { 
        ChildContentView {
            List(changingList) { item in
                print("\(item)")
            }
        }
    }
}
...

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020

Я один месяц на SwiftUI, поэтому я не до конца понимаю, почему это работает. Однако, установив переменную как константу «let», содержимое представления передается напрямую с обновлениями.

Измените:

struct ChildContentView<Content: View>: View {
    @State var content: () -> Content

    var body: some View {
        let dragGesture = DragGesture()...

        return Group {
            self.content()
        }.gesture(dragGesture)
    }
}

на следующее:

struct ChildContentView<Content: View>: View {
    let content: () -> Content

    var body: some View {
        let dragGesture = DragGesture()...

        return Group {
            self.content()
        }.gesture(dragGesture)
    }
}
0 голосов
/ 13 февраля 2020

Ваша проблема в оболочке свойства State

struct ChildContentView<Content: View>: View {

@State var content: () -> Content

    var body: some View {
        let dragGesture = DragGesture()...

        return Group {
            self.content()
        }.gesture(dragGesture)
    }
}

Это делает содержимое "stati c" (на самом деле вы это сделали: -))

Давайте посмотрим и попробуем этот пример (копировать - вставить - запустить в вашем симуляторе)

import SwiftUI
struct Child<Content: View>: View {
    var content: () -> Content
    var body: some View {
        content()
    }
}

struct Item: Identifiable {
    let txt: String
    let id = UUID()
}

struct ContentView: View {
    @State var items = [Item(txt: "Alfa"), Item(txt: "Beta")]
    var body: some View {
        ZStack {
            Child {
                List(self.items) { (item) in
                    Text(item.txt)
                }
            }
            Button(action: {
                self.items.append(contentsOf: [Item(txt: "game"), Item(txt: "Delta")])
            }) {
                Text("Tap me to change items").padding().padding(.vertical, 50).background(Color.yellow)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
0 голосов
/ 13 февраля 2020

Убедитесь, что элемент в списке изменяет свое значение id при изменении содержимого. По сути, имеет sh визуальный контент для создания уникального значения для каждого визуального состояния.

например,

struct FooItem: Identifiable {
  var id: UUID = UUID()
  var text: String = ""

  var visualID: String {
    return id.uuidString
      + "\(text.hashValue)"
  }

}

Я предполагаю, что внутреннее кэширование ZStack не распознает, что объект изменился, когда id не изменился.

То есть, используя ForEach, это то, что у меня есть в моем коде (но List также имеет id) ...

var body: some View {
    ZStack {
      ForEach(self.changingList, id: \.visualID) { item in
        SomeView(item: item)
          .onTapGesture {
            //blah blah
        }
      }
    }
}

Я бью себя по голове этот точный вопрос в течение нескольких дней, пока не решится.

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