SwiftUI 如何获取对 List 内编辑 Textfield 的参考?

Posted

技术标签:

【中文标题】SwiftUI 如何获取对 List 内编辑 Textfield 的参考?【英文标题】:SwiftUI how to get reference to editing Textfield inside a List? 【发布时间】:2019-07-05 13:25:40 【问题描述】:

是否可以根据标签在 SwiftUI 中找到特定视图?还是下面有我的问题的另一种解决方案?

基于 List A 中一行中的 Textfield 中的字符串,正在填充 List B 中的搜索结果。

当点击 List B 上的一行时,我希望更新 List A 上的 textField。 但问题是我不知道如何获取活动的 textField 或 List A 中的行索引。

请参考此图片以确保清晰

我试图模仿这种行为,这在桌面上很常见。您在 Textfield 中输入文本,然后使用鼠标或向上箭头键选择一个选项,然后 Textfield 将使用该选项进行更新。

这里使用单独的列表视图而不是 PopOver。

【问题讨论】:

【参考方案1】:

在下面的代码中,您可以看到如何完成您需要的大部分事情。

您提到您想知道您正在输入的字段。您可以通过使用 onEdintingChanged 闭包来做到这一点。此闭包接收一个布尔值,该值指示该字段是处于活动状态还是非活动状态。您可以使用它来设置变量,如示例中所示:activeField。

您的另一个要求是能够在每次击键时刷新列表。 onReceive 修饰符订阅 TextField 的绑定并为每个执行您的闭包。但是,我认为这是一个错误:当两个字段中都有文本时,每次击键时都会为这两个字段执行闭包。比较 self.activeField 的 if 语句可以防止这种情况发生。

所以,现在,您可以通过闭包触发外部模型的更新。由于您的 List 应该绑定到同一个模型,它会自动刷新。

您的另一个要求是点击列表应该更新您的文本字段。这很简单。如果你的 textfield 绑定到同一个模型,你只需更新对应的模型变量,字段就会更新。

我希望我已经清楚了。

struct ContentView : View 
    @State private var field1 = ""
    @State private var field2 = ""

    @State private var activeField: Int = 0

    var body: some View 
        VStack 
            TextField("", text: $field1, onEditingChanged:  if $0  self.activeField = 0  )
                .textFieldStyle(.roundedBorder)
                .onReceive(field1.publisher().last())  if self.activeField == 0  print("FIELD 1 -> \(self.field1): \($0)")  

            TextField("", text: $field2, onEditingChanged:  if $0  self.activeField = 1  )
                .textFieldStyle(.roundedBorder)
                .onReceive(field2.publisher().last())  if self.activeField == 1  print("FIELD 2 -> \(self.field2): \($0)")  
        
    


【讨论】:

感谢 ?? 的详细帖子。 onEditingChanged,activeField 几乎满足了我的要求,再次感谢。

以上是关于SwiftUI 如何获取对 List 内编辑 Textfield 的参考?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI中如何快速开启和关闭List的编辑状态(Edit Mode)

如何删除 List 中的项目? SwiftUI

如何在 SwiftUI 中的文件、编辑和查看之前将项目添加到应用程序菜单?

如何在 SwiftUI TextEditor 中获取用户选择的文本

SwiftUI - 如果在 ForEach 循环内

编辑 Core Data 类实例字符串时,SwiftUI List 中的 TextField 出现光标定位错误?