簡體   English   中英

SwiftUI:防止視圖在呈現工作表時刷新

[英]SwiftUI: prevent View from refreshing when presenting a sheet

我注意到 SwiftUI 在添加工作sheet修改器時完全刷新視圖。

假設我有顯示隨機數的視圖。 我希望這個值是獨立的並且不連接到工作表邏輯(每次打開/關閉工作表時都不會改變),但每次工作表呈現/關閉時文本都在改變

它應該這樣工作嗎? @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")
        }
    }
}

PS ContentView 只調用onAppear() / onDisappear()init()

它需要制作獨立的獨立於條件的視圖來實現你想要的行為,如下所示

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狀態。

阿斯佩里傷心:

視圖是結構體,值類型,如果它的任何部分發生變化,則整個值都發生了變化

他是絕對正確的! 但是為此我們有狀態屬性。 重新創建視圖時,狀態的值不會改變。

這應該工作,正如你所期望的

struct ContentView: View {

    @State var active = false
    @State var number = Int.random(in: 0 ... 100)
    var body: some View {
        VStack {
            Text("Random text: \(number)")

            Button(action: { self.active.toggle() }) {
                Text("Show pop up")
            }
        }
        .sheet(isPresented: $active) {
            Text("POP UP")
        }
    }
}

優勢是什么? 對於簡單的事情,狀態/綁定是最好的解決方案,毫無疑問。

import SwiftUI

struct SheetView: View {
    @Binding var randomnumber: Int
    var body: some View {
        Button(action: {
            self.randomnumber = Int.random(in: 0 ... 100)
        }) {
            Text("Generate new random number")
        }
    }
}
struct ContentView: View {

    @State var active = false
    @State var number = Int.random(in: 0 ... 100)
    var body: some View {
        VStack {
            Text("Random text: \(number)")

            Button(action: { self.active.toggle() }) {
                Text("Show pop up")
            }
        }
        .sheet(isPresented: $active) {
            SheetView(randomnumber: self.$number)
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

現在您可以在生成或不生成新隨機數的情況下關閉工作表。 不需要外部模型...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM