繁体   English   中英

在 SwiftUI 中重新创建视图后如何停止重新创建 @state 变量

[英]How to stop recreating @state variable after recreating view in SwiftUI

@State var myDict: [String: Double] = [:]

var body: some View {
    HStack(alignment: .top) {
        Button(action: {
            self.myDict[self.tag ?? ""] = amountValue
        }) 
    }
}

我有两个用户,当我 select 第一个用户我向 myDict 添加值,当我 select 第二个用户我想向它添加另一个值(意味着 myDict 将有 2 个对象),但是当我 select 第二个用户 @state 变量刷新并且只有第二个用户的一个值。 (意味着 myDict 有 1 个对象)

有什么办法可以让我同时拥有 dict 中的价值而不仅仅是一个?

实际上,这可能发生在两个用户 self.tag 为 nil 并且 ("") 用作字典的键时

self.myDict[self.tag ?? ""] = amountValue

如果发生这种情况,您可能需要确保 self.tag 不为 nil

我已经像你的情况一样创建了一个测试环境,但我有

import SwiftUI

struct swiftUIDoubt1: View {
    

    @State var myDict: [String: Double] = [:]
    
    var body: some View {
        VStack{
            Button(action: {
                myDict["Hello, World!"] = 9.99999
                print(myDict)
            }, label: {
                Text("\(myDict["Hello, World!"] ?? 0)")
                    .padding()
            })
            
            Button(action: {
                myDict["bye, World!"] = 1.11111
                print(myDict)
            }, label: {
                Text("\(myDict["bye, World!"] ?? 0)")
                    .padding()
            })
            
        }
        .onAppear(perform: {
            print(myDict)
        })
    }
}

现在你可以看到我的屏幕何时出现我的字典应该是空的并且必须打印一个空字典,正如你在应用程序首次打开时在图像控制台日志中看到的那样

首次打开应用程序时的控制台日志

首次打开应用程序时的设备屏幕

当我单击第一个按钮时,将添加单个项目,您可以在控制台日志中看到添加的单个项目

当我点击第二个按钮时,你可以看到我的字典中有两个不同的项目

添加了两个项目

let success = "two different items has been added to dictionary"

作为@state 变量由 swift UI 管理并且不会随着 ui 更新而改变

小例子:子视图中的添加更新父视图中所需用户的字典

import SwiftUI

struct UpdateUsersDict: View {
    @State var myDict: [String: Double] = [:]
    @State var amount: Double = 100
    var body: some View {
        VStack {
            HStack {
                OneUserView(myDict: $myDict, amount: amount, tag: "user 1")
                OneUserView(myDict: $myDict, amount: amount, tag: "user 2")
                OneUserView(myDict: $myDict, amount: amount, tag: "user 3")
            }
            HStack {
                Text("\(myDict["user 1"] ?? -1)")
                Text("\(myDict["user 2"] ?? -1)")
                Text("\(myDict["user 3"] ?? -1)")
            }
        }
    }
}

struct OneUserView: View {
    @Binding var myDict: [String: Double]
    @State var amount: Double
    var tag: String

    var body: some View {
        HStack(alignment: .top) {
            Button(tag, action: {
                self.myDict[self.tag] = amount
            })
        }
    }
}

struct UpdateUserDict_Previews: PreviewProvider {
    static var previews: some View {
        UpdateUsersDict()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM