如何在 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 个对象)
有什么办法可以让我同时拥有字典中的两个值而不是一个?
实际上,这可能发生在两个用户 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)
})
}
}
现在你可以看到我的屏幕何时出现我的词典应该是空的并且必须打印一个空词典,如图所示
console log when the app is first opened
当我单击第一个按钮时,将添加单个项目,您可以在控制台日志中看到
当我单击第二个按钮时,您可以看到我的字典中有两个不同的项目
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()
}
}
@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 个对象)
有什么办法可以让我同时拥有字典中的两个值而不是一个?
实际上,这可能发生在两个用户 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)
})
}
}
现在你可以看到我的屏幕何时出现我的词典应该是空的并且必须打印一个空词典,如图所示 console log when the app is first opened
当我单击第一个按钮时,将添加单个项目,您可以在控制台日志中看到
当我单击第二个按钮时,您可以看到我的字典中有两个不同的项目
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()
}
}