SwiftUI:呈现工作表时阻止视图刷新

时间:2020-02-07 10:49:38

标签: ios swift swiftui

我已经注意到,在添加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()

2 个答案:

答案 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

现在,无论是否生成新的随机数,您都可以关闭工作表。不需要外部模型...