If you want to use 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 NumberRangeController protocol.
func setBounds(_ bounds: ClosedRange<Double>):Function called when the minimum and maximum of numeric filter view have been defined.var onRangeChanged: ((ClosedRange<Double>) -> Void)?Closure to call when new bounds is set for the numeric range filter.
InstantSearch provides the NumberRangeObservableController data model,
which is an implementation of the NumberRangeController protocol adapted for usage with SwiftUI.
NumberRangeObservableController must be connected to the NumberRangeConnector or NumberRangeConnector like any other NumberRangeController implementation.The example of the number range view using two Stepper components provided by SwiftUI.
Swift
struct ContentView: View { @ObservedObject var numberRangeController: NumberRangeObservableController<Int> var body: some View { let range = numberRangeController.range VStack{ Stepper(onIncrement: { if let range = makeRange(range.lowerBound+1, range.upperBound) { numberRangeController.range = range } }, onDecrement: { if let range = makeRange(range.lowerBound-1, range.upperBound) { numberRangeController.range = range } }, label: { Text("Lower bound: \(range.lowerBound)") }) Stepper(onIncrement: { if let range = makeRange(range.lowerBound, range.upperBound+1) { numberRangeController.range = range } }, onDecrement: { if let range = makeRange(range.lowerBound, range.upperBound-1) { numberRangeController.range = range } }, label: { Text("Upper bound: \(numberRangeController.range.upperBound)") }) } } func makeRange(_ lowerBound: Int, _ upperBound: Int) -> ClosedRange<Int>? { if lowerBound < upperBound && numberRangeController.bounds.contains(lowerBound) && numberRangeController.bounds.contains(upperBound) { return lowerBound...upperBound } else { return nil } }}
If you prefer to create a custom SwiftUI view that presents the numeric range,
you can directly use the NumberRangeObservableController as a data model.
It provides range and bounds properties to streamline the design process of your custom SwiftUI view.