我在SwiftUI视图中有以下代码:
@EnvironmentObject var settings:Settings
@State var presetname:String = ""
@State var presets:[RecordingPreset] = []
@State var currentPreset = RecordingPreset()
字符串
然后在body
var中:
Section("Rename") {
TextField(currentPreset.name!, text: $presetname)
.onSubmit {
settings.renamePreset(presetname, preset: currentPreset)
presets = settings.presets //<-- This is not updated
currentPreset = settings.currentPreset //<-- This is also not updated
NSLog("Updating current preset name to \(currentPreset.name),
\(settings.currentPreset.name)")
//The two names above are not same until I dismiss and reopen the app, why?
}
}
型
正如上面的代码注解所示,我可以通过NSLog
看到状态变量presets
和currentPreset.name
没有更新,为什么会这样?如果有人需要,我可以分享更多的代码。
编辑:我发现的问题是RecordingPreset
是一个结构体,它确认为Equatable
,Identifiable
public struct RecordingPreset:Equatable, Identifiable {
public static func == (lhs: RecordingPreset, rhs: RecordingPreset) -> Bool {
return lhs.id == rhs.id
}
public var id:UUID
public var name:String?
...
}
型
SwiftUI似乎拒绝更新State vars,因为数组中所有元素的id
保持不变,即使成员name
发生了变化。作为解决方案,我被迫执行以下操作:
Section("Rename") {
TextField(currentPreset.name!, text: $presetname)
.onSubmit {
settings.renamePreset(presetname, preset: currentPreset)
presets = [] //Force update
presets = settings.presets
currentPreset = settings.currentPreset
}
}
型
1条答案
按热度按时间h7wcgrx31#
如果在
body
中没有使用presentName
getter,那么需要在捕获列表中使用它,如下所示:字符串
这是为了在每次
presentName
更改时创建一个新的闭包,现在它将具有最新的值。body
仅在@State
被设置后调用,如果使用了getter。