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

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

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

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

请参考此图片以确保清晰

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

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

【问题讨论】:

    标签: uitextfield swiftui


    【解决方案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 几乎满足了我的要求,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2020-06-11
    • 2021-10-31
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多