【问题标题】:Keep previous value for state var that will be change in the future保留将来会更改的状态变量的先前值
【发布时间】:2022-11-11 20:22:22
【问题描述】:

我有多个将在 TextField 中更改的 @State var,但我想保留在 TextField 上更改状态值后要使用的旧值

@State var name: String

var oldName = ???

最好的方法是什么?

【问题讨论】:

  • 你试过didSet { oldValue }吗?恕我直言,最好是学习 Swift 和 SwiftUI 的基础知识。否则会浪费更多时间在 stackoverflow 上提出问题,这些问题将在文档中介绍
  • @user1046037 didSet 不适用于 @State 属性包装器
  • @vadian 我错过了什么吗?似乎对我有用@State private var name: String? { didSet { print("oldValue = \(oldValue ?? "nil")") }}
  • @user1046037 请在didSet 闭包中尝试oldName = oldValue,并在视图中显示oldNameText(oldName)。什么都不会发生。
  • 不,didSet 不起作用,因为name 属性实际上是State 类型(这就是属性包装器的用途)。更改$name 值实际上不会更改或设置State 属性,因此永远不会调用didSet

标签: ios swift swiftui state


【解决方案1】:

更新以记住最初的名字,而不是以前的名字。

如果您想记住初始名称,则必须由父视图作为常规常量提供。这样,它就与TextField 操作的可修改状态属性分离。现在唯一缺少的是文本字段需要预先填写初始名称。这不能(不应该)在视图的init() 中完成,而是使用诸如.onAppear 之类的生命周期事件。

struct TextFieldView: View {
    let initialName: String

    @State private var name: String
    
    var body: some View {
        TextField("Name", text: $name)
            .onAppear { self.name = initialName }
    }
}

【讨论】:

  • 感谢您的答复!但它仍然不起作用,它不保留初始值,它保留插入的前一个字母。新值=“文本”,旧值=“特克斯”。我想在更改输入字段后保持初始值,例如:oldValue="day", newValue="night"
  • 我想在修改文本字段之前保留旧值,即初始值
  • 请检查更新的答案。也可能更新您的问题,因为标题字面上要求以前的价值,这显然不是你想要的。
【解决方案2】:

如果要保留旧值,则必须实现 .onSubmit 修饰符,因为如果文本字段绑定到 name,则每次击键时值都会更改。

您可以添加第三个 @State 属性 text 并在提交时交换值

struct TextFieldView: View {
    @State private var text = ""
    @State private var name = ""
    @State private var oldName = ""
    
    var body: some View {
        VStack {
            TextField("Name", text: $text)
                .onSubmit {
                    oldName = name
                    name = current
                }
            Text(oldName)
        }
    }
}

【讨论】:

  • 在 Swift 中没有简单的解决方案吗?就像添加一个常量变量?
  • 这是 SwiftUI 视图中的一个非常简单的解决方案。
  • 我测试了,它不起作用
猜你喜欢
  • 2021-08-07
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2022-10-13
  • 2018-11-24
  • 2018-01-03
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多