SwiftUI 如何获取在列表中编辑文本字段的参考?
SwiftUI how to get reference to editing Textfield inside a List?
是否可以根据标签在 SwiftUI 中找到特定视图?或者下面是否有其他解决我的问题的方法?
基于列表A中一行文本字段中的字符串,正在列表B中填充搜索结果。
当点击 List B 上的一行时,我希望更新 List A 上的 textField。
但问题是我不知道如何获取活动文本字段或 List A.
中行的索引
为了清楚起见,请参考此图片
我正在尝试模拟这种在台式机中很常见的行为。您在文本字段中输入文本,然后使用鼠标或上下箭头键 select 一个选项,然后文本字段会更新为该选项。
这里使用单独的列表视图而不是 PopOver。
在下面的代码中,您可以看到如何完成您需要的大部分事情。
你提到你想知道你在哪个字段上打字。您可以使用 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 [=10=] { self.activeField = 0 } })
.textFieldStyle(.roundedBorder)
.onReceive(field1.publisher().last()) { if self.activeField == 0 { print("FIELD 1 -> \(self.field1): \([=10=])") } }
TextField("", text: $field2, onEditingChanged: { if [=10=] { self.activeField = 1 } })
.textFieldStyle(.roundedBorder)
.onReceive(field2.publisher().last()) { if self.activeField == 1 { print("FIELD 2 -> \(self.field2): \([=10=])") } }
}
}
}
是否可以根据标签在 SwiftUI 中找到特定视图?或者下面是否有其他解决我的问题的方法?
基于列表A中一行文本字段中的字符串,正在列表B中填充搜索结果。
当点击 List B 上的一行时,我希望更新 List A 上的 textField。 但问题是我不知道如何获取活动文本字段或 List A.
中行的索引为了清楚起见,请参考此图片
我正在尝试模拟这种在台式机中很常见的行为。您在文本字段中输入文本,然后使用鼠标或上下箭头键 select 一个选项,然后文本字段会更新为该选项。
这里使用单独的列表视图而不是 PopOver。
在下面的代码中,您可以看到如何完成您需要的大部分事情。
你提到你想知道你在哪个字段上打字。您可以使用 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 [=10=] { self.activeField = 0 } })
.textFieldStyle(.roundedBorder)
.onReceive(field1.publisher().last()) { if self.activeField == 0 { print("FIELD 1 -> \(self.field1): \([=10=])") } }
TextField("", text: $field2, onEditingChanged: { if [=10=] { self.activeField = 1 } })
.textFieldStyle(.roundedBorder)
.onReceive(field2.publisher().last()) { if self.activeField == 1 { print("FIELD 2 -> \(self.field2): \([=10=])") } }
}
}
}