我已经注意到,在添加sheet
修饰符时,SwiftUI会完全刷新视图。
假设我有一个显示随机数的View。我希望该值是独立的,并且不会与工作表逻辑相关联(每次打开/关闭工作表时都不会更改),但是每个工作表显示/关闭的文本都在更改。
是否应该这样工作?
我错了@Sate
的要点是仅更新已连接的视图,而不是全部堆栈吗?
呈现模态时如何防止我的视图刷新?
struct ContentView: View {
@State var active = false
var body: some View {
VStack {
Text("Random text: \(Int.random(in: 0...100))")
Button(action: { self.active.toggle() }) {
Text("Show pop up")
}
}
.sheet(isPresented: $active) {
Text("POP UP")
}
}
}
P.S。 ContentView仅调用onAppear()
/ onDisappear()
和init()
。
答案 0 :(得分:14)
它需要制作独立于条件的独立视图以实现您想要的行为,如下所示
struct RandomView: View {
var body: some View {
Text("Random text: \(Int.random(in: 0...100))")
}
}
struct ContentView: View {
@State var active = false
var body: some View {
VStack {
RandomView()
Button(action: { self.active.toggle() }) {
Text("Show pop up")
}
}
.sheet(isPresented: $active) {
Text("POP UP")
}
}
}
在这种情况下,RandomView
不重建,因为它不依赖于active
状态。
答案 1 :(得分:1)
Asperi悲伤:
视图是结构,值类型,如果它的任何部分发生了更改,则整个 值已更改
他绝对正确!但是为此,我们具有状态属性。重新创建视图时,状态的值不变。
这应该可以正常工作
singleton
有什么好处?对于简单的事情,毫无疑问,状态/绑定是最好的解决方案。
singleton
现在,无论是否生成新的随机数,您都可以关闭工作表。不需要外部模型...