SwiftUI - 如何修改数组中的文本字段

Posted

技术标签:

【中文标题】SwiftUI - 如何修改数组中的文本字段【英文标题】:SwiftUI - How to modify textfield in an array 【发布时间】:2021-09-06 14:09:45 【问题描述】:

在以下代码中,您可以将其复制到一个新的 SwiftUI 项目中,当我运行它并开始在文本字段中输入时,该字段在每个字符后失去焦点。我怎样才能解决这个问题?我不了解可观察对象,所以也许这就是问题所在?顺便说一句,我使用的是 Xcode 13.0 Beta 5

struct CmdOption: Hashable, Identifiable 
    var id: UUID  UUID() 
    var value: String


import SwiftUI

struct ContentView: View 
    
    @State var theOptions: [CmdOption] = [
        CmdOption(value: ""),
        CmdOption(value: "")
    ]
    
    @State var allOptions: [CmdOption] = []
    
    var body: some View 
        VStack 
            ScrollView(.vertical) 
                ForEach($allOptions, id: \.self)   $option in
                    VStack 
                        TextField(option.value, text: $option.value)
                    
                
            
        .onAppear 
            startup()
        
    
    func startup() 
        allOptions.removeAll()
        theOptions.forEach option in
            allOptions.append(option)
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

【问题讨论】:

【参考方案1】:

有两个问题:

    您将id 作为计算属性。这意味着 每次 您尝试读取该值时它都会发生变化。 您正在使用id: \.self,它不是唯一的(因为id 也被存储为计算属性,所以默认Hashable 一致性不考虑它)。

要解决此问题,请将 CmdOption 更改为以下内容:

struct CmdOption: Hashable, Identifiable 
    let id: UUID = UUID()
    var value: String

还有你的ForEach(隐含id: \.id):

ForEach($allOptions)  $option in
    VStack 
        TextField(option.value, text: $option.value)
    

现在,这些视图的 ID 是常量唯一TextFields 现在将不再失去焦点,因为它们不会在每次重新计算 ContentView 的主体时重新创建视图,因为它们的 ID 保持不变。请参阅 Demystify SwiftUI - WWDC21 了解有关 ID 如何影响视图生命周期的更多信息。

【讨论】:

谢谢乔治。这解决了它。

以上是关于SwiftUI - 如何修改数组中的文本字段的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中的 forEach 期间将文本字段输入添加到数组

如何从 webkit swiftUI 中的文本字段中搜索自定义文本

文本字段点击正在关闭 SwiftUI 中的导航链接

SwiftUI 在视图之间切换

我的搜索栏中的文本字段不允许输入文本(swiftUI)

SwiftUI 中的多行可编辑文本字段