是否有可能基于SwiftUI的标签找到特定视图?还是下面有我的问题的另一种解决方案?
基于列表A 中行中文本字段中的字符串,将搜索结果填充到列表B 中。
当点击列表B 上的一行时,我希望更新列表A 上的textField。 但是问题是我不知道如何掌握有效的textField或列表A 中行的索引。
我正在尝试模仿这种行为,这在台式机中很常见。您在“文本字段”中输入文本,然后使用鼠标或上下箭头键选择一个选项,然后“文本字段”将使用该选项进行更新。
此处使用单独的列表视图代替PopOver。
答案 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)") } }
}
}
}