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)
如何在 SwiftUI 中的文件、编辑和查看之前将项目添加到应用程序菜单?