简体   繁体   English

SwiftUI:关闭列表可搜索键盘?

[英]SwiftUI: dismiss List searchable keyboard?

I have a view that uses searchable.我有一个使用可搜索的视图。 I would like do dismiss the keyboard programmatically if user starts scrolling on the List.如果用户开始在列表上滚动,我想以编程方式关闭键盘。 Same behavior as you see in the Contacts app.与您在“通讯录”应用中看到的行为相同。

@State var query:String = ""

var body: some View {
    NavigationView {
        List {
            ForEach(items) { item in
                NavigationLink {
                    Text("Item at \(item.timestamp!, formatter: itemFormatter)")
                } label: {
                    Text(item.timestamp!, formatter: itemFormatter)
                }
            }
            .onDelete(perform: deleteItems)
        }
        .searchable(text: $query, prompt: Text("search"))
        .simultaneousGesture(DragGesture().onChanged({ _ in
            /// <-- dismiss keyboard??
        }))
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                EditButton()
            }
            ToolbarItem {
                Button(action: addItem) {
                    Label("Add Item", systemImage: "plus")
                }
            }
        }
        Text("Select an item")
    }
}

I can detect the scroll event, but, I am not sure how to actually dismiss the keyboard.我可以检测到滚动事件,但是,我不确定如何真正关闭键盘。

I saw some approaches using endEditing on the view... but, I wonder about using focuseScope .我看到了一些在视图上使用endEditing的方法......但是,我想知道使用focuseScope I found some information about it here:我在这里找到了一些关于它的信息:

https://swiftwithmajid.com/2020/12/02/focus-management-in-swiftui/ https://swiftwithmajid.com/2020/12/02/focus-management-in-swiftui/

How can I dismiss the keyboard, and preferably, use focus instead of calling something generic on the whole view?我怎样才能关闭键盘,最好使用focus而不是在整个视图上调用通用的东西?

Use the dismissSearch environment value to get the DismissSearchAction instance for the current Environment.使用dismissSearch环境值获取当前环境的DismissSearchAction实例。 Then call the instance to dismiss the current search interaction.然后调用实例来关闭当前的搜索交互。

When you dismiss the search, SwiftUI sets isSearching to false and removes focus from the search field.当您关闭搜索时, isSearching将 isSearching 设置为 false 并从搜索字段中移除焦点。

@State var query:String = ""
@Environment(\.dismissSearch) private var dismissSearch

var body: some View {
    NavigationView {
        List {
            ForEach(items) { item in
                NavigationLink {
                    Text("Item at \(item.timestamp!, formatter: itemFormatter)")
                } label: {
                    Text(item.timestamp!, formatter: itemFormatter)
                }
            }
            .onDelete(perform: deleteItems)
        }
        .searchable(text: $query, prompt: Text("search"))
        .simultaneousGesture(DragGesture().onChanged({ _ in
            dismissSearch()
        }))
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                EditButton()
            }
            ToolbarItem {
                Button(action: addItem) {
                    Label("Add Item", systemImage: "plus")
                }
            }
        }
        Text("Select an item")
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM