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 ...
    }
}