SwiftUI状态变量未在提交时的TextField内更新

slhcrj9b  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(70)

我在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看到状态变量presetscurrentPreset.name没有更新,为什么会这样?如果有人需要,我可以分享更多的代码。
编辑:我发现的问题是RecordingPreset是一个结构体,它确认为EquatableIdentifiable

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
                }
        }

h7wcgrx3

h7wcgrx31#

如果在body中没有使用presentName getter,那么需要在捕获列表中使用它,如下所示:

.onSubmit { [presentName] in

字符串
这是为了在每次presentName更改时创建一个新的闭包,现在它将具有最新的值。
body仅在@State被设置后调用,如果使用了getter。

相关问题