我对SwiftUI相当陌生,我试图构建一个带有多个WKWebView的应用程序,只要按一下按钮就可以循环完成。我一直未能在WebViewRepresentables (WKWebKit包装器)之间切换。由于包装UIKit和处理所有的委托是一件复杂的事情,我认为有更多的空间,错误,并决定创建另一个项目,只有颜色被循环通过。
我正在试着在下面的代码片段中查看ColorView。
我期待着在3秒后看到这一幕。消息3秒,在之后,我找到了他们(onAppear{})。但是,一旦它为第一个视图运行,它也会运行所有其他视图。当我按下按钮的时候,另外两个人也有了文本。
为什么onAppear代码块只运行一次(断点只命中一次),结果适用于每个视图,尽管它们都是ColorView的不同实例。
我期望每个视图只生成一次随机数,但在下面的代码片段中,我观察到每次切换到下一个视图时都会生成一个新的随机数。我认为将它们存储在内存数组中会防止这种情况发生,因为它们只会被安装一次?
内存缓存视图的正确方式是什么,以便在它们之间切换(每个视图只初始化一次,而不每次显示刷新)?
struct ColorView: View {
@State private var text = ""
let color: Color
var body: some View {
VStack {
Text(text)
Text("\(Int.random(in: 1..<10))")
color
}
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.text = "This is after 3 seconds."
}
}
}
}
struct ContentView: View {
@State private var colors: [ColorView] = [ColorView(color: .red), ColorView(color: .yellow), ColorView(color: .gray)]
@State private var index = 0
var body: some View {
VStack {
Text("page \(index)")
Button(action: { index += 1; index = index % 3 }, label: { Text("Go through") })
colors[index]
}
}
}发布于 2021-10-24 17:54:03
请考虑Asperi的注释,但是如果您想强制执行该任务,请按照下面的命令理解SwiftUI是如何工作的:这个附加程序是因为视图是第一次加载的,并且只有当内部的某些内容发生变化时,它才会运行。
如果添加.id(),则如果id正在更改,则视图将刷新。
结构ContentView:视图{@国营私有变量颜色: ColorView =ColorView(颜色:.red),ColorView(颜色:.yellow),ColorView(颜色:.gray) @国营私有变量索引=0
var body: some View {
VStack {
Text("page \(index)")
Button(action: { index += 1; index = index % 3 }, label: { Text("Go through") })
Divider()
colors[index]
.id(index) //--> add this
}
}https://stackoverflow.com/questions/69698254
复制相似问题