SwiftUI如何获取对在列表中编辑Textfield的引用?

时间:2019-07-05 13:25:40

标签: uitextfield swiftui

是否有可能基于SwiftUI的标签找到特定视图?还是下面有我的问题的另一种解决方案?

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

当点击列表B 上的一行时,我希望更新列表A 上的textField。 但是问题是我不知道如何掌握有效的textField或列表A 中行的索引。

为清楚起见,请参阅此图片enter image description here

我正在尝试模仿这种行为,这在台式机中很常见。您在“文本字段”中输入文本,然后使用鼠标或上下箭头键选择一个选项,然后“文本字段”将使用该选项进行更新。

enter image description here

此处使用单独的列表视图代替PopOver。

1 个答案:

答案 0 :(得分:1)

在下面的代码中,您可以看到如何完成所需的大多数事情。

您提到您想知道要在哪个字段上键入。您可以通过使用onEdintingChanged闭包来实现。此闭包接收一个布尔值,该值指示该字段是活动的还是非活动的。您可以使用它来设置变量,例如示例:activeField。

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

因此,现在,您可以从关闭中触发外部模型的更新。由于您的列表应绑定到同一模型,因此它将自动刷新。

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

我希望我已经清楚了。

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