SwiftUI 如何获得在列表中编辑文本字段的参考?

raw*_*w3d 1 uitextfield swiftui

是否可以根据其标签在 SwiftUI 中找到特定视图?或者下面有没有其他解决方案可以解决我的问题?

基于列表 A中行中文本字段中的字符串,在列表 B 中填充搜索结果

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

为清楚起见,请参阅此图片 在此处输入图片说明

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

在此处输入图片说明

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

kon*_*iki 6

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

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

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

因此,现在,您可以从闭包中触发外部模型的更新。由于您的 List 应该绑定到相同的模型,它会自动刷新。

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

我希望我已经清楚了。

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

Run Code Online (Sandbox Code Playgroud)