ios - SwiftUI:将动态数据传递给内容视图后重绘
问题描述
我有类似下面的东西,除了我在“ChildContentView”中有额外的动态手势。
我将如何强制子视图重绘/重新加载?目前,任何动态内容都会绘制一次并且不会重新加载。所有内容基本上都是静态的。
更新:需要使用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)")
}
}
}
}
...
解决方案
你的麻烦是 State 属性包装器
struct ChildContentView<Content: View>: View {
@State var content: () -> Content
var body: some View {
let dragGesture = DragGesture()...
return Group {
self.content()
}.gesture(dragGesture)
}
}
它使内容“静态”(实际上你做到了:-))
让我们看看并尝试这个例子(复制 - 粘贴 - 在你的模拟器中运行)
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()
}
}
推荐阅读
- python - 如何分发列表?
- javascript - 在 React 中测试 DOM 更新
- firebase - Flutter:识别firebase集合中是否有文档
- python - 如何修复“import crccheck”上的 Pylint 导入错误?
- python - 按日期和总和列分组
- ffmpeg - MXE 编译,openjpeg.h not found 错误
- python - 如何将此代码转换为功能工作代码?
- sql - NOT EXISTS 查询与 REPLACE 永远运行
- apache-kafka - 无法在kafka connect中使用接收器连接器
- google-sheets - 如何根据往年数据计算 Google 表格中的概率