根据数组中的重复模式更改 SwiftUI 列表中文本字段的第二次出现

Posted

技术标签:

【中文标题】根据数组中的重复模式更改 SwiftUI 列表中文本字段的第二次出现【英文标题】:Changing second occurrence of textfield in a SwiftUI List based on repeating pattern in array 【发布时间】:2020-07-18 08:26:25 【问题描述】:

当给定 4 个文本字段的模式(例如 ABAB)时,我试图弄清楚如何使用在该字母的第一个文本字段出现中键入的句子的最后一个单词填充每个字母的第二个文本字段出现。因此,如果在第一行中使用模式 ABAB 键入“What the heck”,则第三行将自动填充“heck”。我已经知道如何从一个句子中过滤出最后一个词,只是在努力解决剩下的问题。

我目前如何设置提及列表: Canvas Screenshot

struct ContentView: View 
    
    @State var textFields: [String]
    var patternLetters = ["A", "B", "A", "B"]

    init()
        _textFields = State(initialValue: Array(repeating: "", count: 4))
    
    
    var body: some View 
        List(0..<4)  line in
            HStack 
                TextField("Enter a sentence", text: self.$textFields[line])
                Spacer()
                Text(self.patternLetters[line])
            
        
    

【问题讨论】:

【参考方案1】:

确实很老套的解决方案,但效果很好:

struct ContentView: View 
    
    @State var textFields: [String]
    var patternLetters = ["A", "B", "A", "B"]

    init()
        _textFields = State(initialValue: Array(repeating: "", count: 4))
    
    
    var body: some View 
        List(0..<4)  line in
            HStack 
                TextField("Enter a sentence", text: Binding(
                    get: 
                        // Check if this is the first occurence of the letter
                        if self.patternLetters.firstIndex(of: self.patternLetters[line]) != line 
                            // is not first occurence so return last work of first occurence 
                            return String(self.textFields[self.patternLetters.firstIndex(of: self.patternLetters[line]) ?? 0].split(separator: " ").last ?? "")
                         else 
                            return self.textFields[line]
                        
                        
                        
                    ,
                    set:  (newValue) in
                       return self.textFields[line] = newValue
                ))
                Spacer()
                Text(self.patternLetters[line])
            
        
    

结果:

我提供的代码只是为了演示它是如何完成的,而不是保存在例如场景中。当应用程序启动后生成数组时。 如果数组不是预先定义的,最后一定要检查索引是否可用。否则,您可能会遇到以下错误:索引超出范围

【讨论】:

谢谢你完美地回答了我的问题。是否有一种方法仍然允许用户以任何方式在自动填充的文本字段中添加或编辑文本,还是需要与通过 get: 方法不同的方法? 就像我宁愿让用户输入一个句子一样,它会使用模式中前一个单词的最后一个单词自动完成最后一个单词。 (当您完美地回答了第一个问题时,无需回答,而且我不需要帮助编程自动完成功能,只需将最后一个单词存储在一个变量中,一旦我对其进行编程,我最终可以将其放入自动完成功能中) 在这种情况下修改set以附加相应前任的最后一个工作

以上是关于根据数组中的重复模式更改 SwiftUI 列表中文本字段的第二次出现的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何在编辑模式下更改列表的背景

SwiftUI 2.0如何更改表单部分的背景颜色[重复]

使用 ForEach SwiftUI Core Data 仅更改列表中的一项

当我的@Published NSManagedObjects 数组更改时,我的 SwiftUI 列表不会更新

在 SwiftUI 中创建一个包含自定义类数组的列表

当视图模型@Published 更改时,SwiftUI 列表因“NSRangeException”而崩溃