This widget displays a list of indices,
allowing a user to change the way hits are sorting
(with replica indices).
Another common use case for this widget is to let users switch between different indices.For this widget to work,
you must define all indices that you pass down as options as replicas of the main .
The controllers provided by default,
like the SelectIndexController work well when you want to use native UIKit with their default behavior like a UIAlertController.If you want to use another component,
a third-party input view,
or you want to introduce some custom behavior to the already provided UIKit component,
you can create your own controller conforming to the SelectableSegmentController protocol.
func setSelected(_ selected: Int?):Function called when an index is selected, with the selected position.func setItems(items: [Int: String])Function called when a new array of indices is defined.func reload()Function called when a reload of the list view is required.var onClick: ((Int) -> Void)?:Closure to call when a new index is clicked.
public class SelectIndexController: NSObject, SelectableSegmentController { let alertController: UIAlertController public var onClick: ((Int) -> Void)? public init(alertController: UIAlertController) { self.alertController = alertController super.init() } public func setSelected(_ selected: Int?) { // Show a check mark next to the item selected here } public func setItems(items: [Int: String]) { guard alertController.actions.isEmpty else { return } for item in items { alertController.addAction(UIAlertAction(title: item.value, style: .default, handler: { [weak self] _ in self?.onClick?(item.key) })) } alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: .none)) }}
InstantSearch provides the SelectableSegmentObservableController data model,
which is an implementation of the SelectableSegmentController protocol adapted for usage with SwiftUI.
SelectableSegmentObservableController must be connected to the SortByConnector or SelectableSegmentInteractor like any other StatsTextController implementation.The example of the sort by view using the Menu component provided by SwiftUI.
Swift
Report incorrect code
Copy
struct ContentView: View { @ObservedObject var selectableSegmentObservableController: SelectableSegmentObservableController var body: some View { Menu { let segmentTitles = selectableSegmentObservableController.segmentsTitles ForEach(0..<segmentTitles.count) { segmentIndex in Button(segmentTitles[segmentIndex]) { selectableSegmentObservableController.select(segmentIndex) } } } label: { if let selectedSegmentIndex = selectableSegmentObservableController.selectedSegmentIndex { Label(selectableSegmentObservableController.segmentsTitles[selectedSegmentIndex], systemImage: "arrow.up.arrow.down.circle") } } }}
If you prefer to create a custom index picker SwiftUI view,
you can directly use the SelectableSegmentObservableController as a data model.
It provides segmentsTitles and selectedSegmentIndex properties along with select function to streamline the design process of your custom SwiftUI view.