[英]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.