SwiftUI-如何在其他视图中响应TextField onCommit?
我制作了一个SwiftUI-如何在其他视图中响应TextField onCommit?,swiftui,textfield,Swiftui,Textfield,我制作了一个SearchBarView视图,用于各种其他视图(为了清晰起见,我删除了所有布局修改器,例如颜色和填充): 在列表中过滤数据看起来效果很好 但是现在我想使用SearchBarView来搜索外部数据库 struct SearchDatabaseView: View { @Binding var isPresented: Bool @State var searchText: String = "" var body: some View {
SearchBarView
视图,用于各种其他视图(为了清晰起见,我删除了所有布局修改器,例如颜色和填充):
在列表
中过滤数据看起来效果很好
但是现在我想使用SearchBarView
来搜索外部数据库
struct SearchDatabaseView: View {
@Binding var isPresented: Bool
@State var searchText: String = ""
var body: some View {
NavigationView {
VStack {
SearchBarView(text: $searchText)
// need something here to respond to onCommit and initiate a network call.
}
.navigationBarTitle("Search...")
.navigationBarItems(trailing:
Button(action: { self.isPresented = false }) {
Text("Done")
})
}
}
}
为此,我只想在用户点击return时启动网络访问。因此,我将onCommit
部分添加到SearchBarView
,而didPressReturn()
函数实际上只在点击return时调用。到目前为止,一切顺利
我不明白的是,包含
SearchBarView
的SearchDatabaseView
如何响应onCommit
并启动数据库searh-我该怎么做?这里是可能的方法
struct SearchBarView: View {
@Binding var text: String
var onCommit: () -> () = {} // inject callback
@State private var isEditing = false
var body: some View {
HStack {
TextField("Search…", text: $text, onCommit: didPressReturn)
.overlay(
HStack {
Image(systemName: "magnifyingglass")
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
if isEditing {
Button(action: {
self.text = ""
}) {
Image(systemName: "multiply.circle.fill")
}
}
}
)
}
func didPressReturn() {
print("did press return")
// do internal things...
self.onCommit() // << external callback
}
}
这是否会影响使用
SearchBarView
但不需要onCommit
要求的其他视图,例如List
过滤?(我离开了我的Mac电脑,直到今天晚些时候才能自己测试)。不,正如所见-让onCommit:()->()={}
-默认为空closure我在你写的地方放了什么//在这里做需要的事情…
?当我在SearchBarView(text:$searchText)
之后添加花括号时,在调用中传递了一个额外的尾随闭包
错误。这必须是变量var onCommit:()->(={}
)。更新了补丁,太棒了!请注意didPressReturn从onCommit调用:参数应以括号结尾,以防止出现错误“表达式解析为未使用的函数”
struct SearchBarView: View {
@Binding var text: String
var onCommit: () -> () = {} // inject callback
@State private var isEditing = false
var body: some View {
HStack {
TextField("Search…", text: $text, onCommit: didPressReturn)
.overlay(
HStack {
Image(systemName: "magnifyingglass")
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
if isEditing {
Button(action: {
self.text = ""
}) {
Image(systemName: "multiply.circle.fill")
}
}
}
)
}
func didPressReturn() {
print("did press return")
// do internal things...
self.onCommit() // << external callback
}
}
VStack {
SearchBarView(text: $searchText) {
// do needed things here ...
}
}