SearchBox
QueryInputConnector( searcher: SingleIndexSearcher, interactor: QueryInputInteractor, searchTriggeringMode: SearchTriggeringMode, controller: QueryInputController )
About this widget
Component that performs a text-based query.
Examples
Instantiate a QueryInputConnector
.
1
2
3
4
5
6
7
8
9
let searcher: SingleIndexSearcher = .init(appID: "YourApplicationID",
apiKey: "YourSearchOnlyAPIKey",
indexName: "YourIndexName")
let searchBarController: SearchBarController = .init(searchBar: UISearchBar())
// If your project targets iOS 13+, you should use TextFieldController(searchBar: UISearchBar()) instead:
// let searchBarController: TextFieldController(searchBar: UISearchBar())
let queryInputConnector: QueryInputConnector = .init(searcher: searcher,
searchTriggeringMode: .searchAsYouType,
controller: searchBarController)
Parameters
searcher
|
type: Searcher
Required
The |
interactor
|
type: QueryInputInteractor
default: .init()
Optional
The logic applied to |
searchTriggeringMode
|
type: SearchTriggeringMode
default: .searchAsYouType
Optional
Defines the event triggering a new search.
Can either be |
controller
|
type: QueryInputController
default: nil
Optional
Controller interfacing with a concrete query input view. |
Low-level API
If you want to fully control the SearchBox
components and connect them manually, you can use the following components:
Searcher
: TheSearcher
that handles your searches.QueryInputInteractor
: The logic that handles new search inputs.QueryInputController
: The controller interfacing with a concrete input view.
1
2
3
4
5
6
7
8
9
let searcher: SingleIndexSearcher = .init(appID: "YourApplicationID",
apiKey: "YourSearchOnlyAPIKey",
indexName: "YourIndexName")
let queryInputInteractor: QueryInputInteractor = .init()
let searchBarController: SearchBarController = .init(searchBar: UISearchBar())
// if your project targets iOS 13+, the usage of TextFieldController(searchBar: UISearchBar()) is recommended
queryInputInteractor.connectSearcher(searcher, searchTriggeringMode: .searchAsYouType)
queryInputInteractor.connectController(searchBarController)
Customizing your view
The default controllers, e.g. TextFieldController
and SearchBarController
, work well when you want to use native UIKit with their default behavior.
If you want to use another component such as a third-party input view, or you want to introduce some custom behavior to the already provided UIKit components, you can create your own controller conforming to the QueryInputController
protocol.
Protocol
var onQueryChanged: ((String?) -> Void)?
:
Closure you should call when the query is modified.
var onQuerySubmitted: ((String?) -> Void)?
Closure you should call when the query is submitted.
func setQuery(_ query: String?)
Function called when the query is modified from the outside.
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class TextFieldController: NSObject, QueryInputController {
public var onQueryChanged: ((String?) -> Void)?
public var onQuerySubmitted: ((String?) -> Void)?
let textField: UITextField
public init (textField: UITextField) {
self.textField = textField
super.init()
setupTextField()
}
public func setQuery(_ query: String?) {
textField.text = query
}
@objc func textFieldTextChanged(textField: UITextField) {
guard let searchText = textField.text else { return }
onQueryChanged?(searchText)
}
private func setupTextField() {
textField.returnKeyType = .search
textField.addTarget(self, action: #selector(textFieldTextChanged), for: .editingChanged)
textField.delegate = self
}
}
extension TextFieldController: UITextFieldDelegate {
public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
onQuerySubmitted?(textField.text)
return true
}
}