![](/img/trans.png)
[英]Why is it in SwiftUI, when presenting modal view with .sheet, init() is called twice
[英]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.