SwiftUI Stepper

The `Stepper` view in SwiftUI provides a simple and intuitive way for users to increment or decrement a value, typically in steps. This control is commonly used for adjusting quantities,

article

The `Stepper` view in SwiftUI provides a simple and intuitive way for users to increment or decrement a value, typically in steps. This control is commonly used for adjusting quantities, setting numeric values, or navigating through a range of options. In this article, we’ll explore how to create and customize steppers in SwiftUI, bind them to state, and use them effectively within your applications.


Creating a Simple Stepper


At its most basic, a `Stepper` in SwiftUI consists of a label and buttons to increment or decrement a value. The `Stepper` is typically bound to a state variable that holds the current value. Here’s a basic example of how to create a simple stepper:



struct ContentView: View {
    @State private var quantity: Int = 1
    
    var body: some View {
        Stepper("Quantity: \(quantity)", value: $quantity, in: 1...10)
            .padding()
    }
}

In this example, the `Stepper` is bound to the `quantity` state variable, which tracks the current value. The user can increment or decrement the quantity within the specified range of 1 to 10. The label displays the current quantity alongside the stepper controls.


Customizing Stepper Appearance


While the `Stepper` itself does not offer many styling options, you can customize the label and layout to better fit your app’s design. For instance, you can change the font, color, or alignment of the label associated with the `Stepper`:



Stepper(value: $quantity, in: 1...10) {
    Text("Quantity: \(quantity)")
        .font(.headline)
        .foregroundColor(.blue)
}
.padding()

In this example, the `Text` label is customized with a headline font and blue color, making it more visually consistent with the app’s design. The `.padding()` modifier adds some space around the stepper, improving the overall layout.


Handling Stepper Value Changes


The `Stepper` automatically updates the bound state variable as the user increments or decrements the value. However, you can also perform additional actions in response to these changes using the `.onChange()` modifier:



Stepper("Quantity: \(quantity)", value: $quantity, in: 1...10)
    .onChange(of: quantity) { newValue in
        print("Quantity changed to: \(newValue)")
    }
    .padding()

In this example, whenever the user adjusts the quantity, the new value is printed to the console. This technique can be useful for updating other parts of the UI, triggering validations, or saving the value as the user interacts with the stepper.


Using Stepper with Custom Step Increments


By default, the `Stepper` increments or decrements the value by 1. However, you can customize the step increment to match your specific use case, such as increasing by larger numbers or even by fractions:



Stepper("Step: \(quantity)", value: $quantity, in: 0...100, step: 5)
    .padding()

In this example, the stepper increments or decrements the value by 5 each time the user interacts with it. This is useful in scenarios where the user needs to quickly adjust the value over a larger range, such as setting volume levels or selecting large quantities.


Disabling the Stepper


There may be cases where you want to disable the `Stepper` based on certain conditions, such as when a process is in progress or when the user lacks permissions to change the value. SwiftUI allows you to easily disable the `Stepper` using the `.disabled()` modifier:



Stepper("Quantity: \(quantity)", value: $quantity, in: 1...10)
    .disabled(quantity == 10)
    .padding()

In this example, the stepper is disabled when the quantity reaches 10. This prevents the user from increasing the value beyond the maximum limit, ensuring that the value stays within the desired range.


Integrating Stepper into Forms


Steppers are often used in forms where users need to specify numeric values, such as in order forms, settings, or configuration screens. SwiftUI’s `Form` view makes it easy to integrate steppers into a structured layout:



struct OrderFormView: View {
    @State private var itemCount = 1
    
    var body: some View {
        Form {
            Section(header: Text("Order Details")) {
                Stepper("Number of items: \(itemCount)", value: $itemCount, in: 1...20)
            }
        }
    }
}

In this example, the `Stepper` is used within a `Form` to allow the user to specify the number of items they want to order. The stepper is grouped under a section header titled "Order Details," providing a clear and organized layout for the form.


instructor

Exodai INSTRUCTOR!

Johan t'Sas

Owner and Swift developer!