gpt4 book ai didi

ios - 防止 SwiftUI 重置 @State

转载 作者:行者123 更新时间:2023-12-01 15:42:54 25 4
gpt4 key购买 nike

我不经常理解 SwiftUI 何时重置 View 的状态(即所有用 @State 标记的)。例如,看看这个最小的例子:

import SwiftUI

struct ContentView: View {
@State private var isView1Active = true
let view1 = View1()
let view2 = View2()

var body: some View {
VStack {
if isView1Active {
view1
} else {
view2
}

Button(action: {
self.isView1Active.toggle()
}, label: {
Text("TAP")
})
}
}
}

struct View1: View {
@State private var text = ""
var body: some View {
TextField("View1: type something...", text: $text)
}
}

struct View2: View {
@State private var text = ""
var body: some View {
TextField("View2: type something...", text: $text)
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

我想要两个 TextField保留它们的内容,但是如果您运行此示例,则会发生一些奇怪的行为:
  • 如果您在 上运行示例预览 只有 View1 TextField内容仍然存在:

  • enter image description here
  • 相反,如果您在 上运行示例。模拟器 (或在 实际设备 上)第一个文本字段内容和第二个文本字段内容均不存在:

  • enter image description here

    那么,这里发生了什么?有没有办法告诉 SwiftUI 不要为 View 重置 @State?谢谢。

    最佳答案

    问题是 View1View2每次都在重新创建 isView1Active已更改(因为它使用 @State 重新加载 ContentView 的主体)。

    一个解决方案是保留 TextField 的文本属性。 s 在 ContentView如下图并使用@Binding :

    struct ContentView: View {

    @State private var isView1Active = true
    @State private var view1Text = ""
    @State private var view2Text = ""

    var body: some View {
    VStack {
    if isView1Active {
    View1(text: $view1Text)
    } else {
    View2(text: $view2Text)
    }

    Button(action: {
    self.isView1Active.toggle()
    }, label: {
    Text("TAP")
    })
    }
    }
    }

    struct View1: View {

    @Binding var text: String

    var body: some View {
    TextField("View1: type something...", text: $text)
    }
    }

    struct View2: View {

    @Binding var text: String

    var body: some View {
    TextField("View2: type something...", text: $text)
    }
    }

    显示在行动中:

    GIF

    关于ios - 防止 SwiftUI 重置 @State,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581607/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com