DatePicker in SwiftUI

The `DatePicker` view in SwiftUI allows users to select dates, times, or both. This view is particularly useful in forms, scheduling apps, and any situation where the user needs to input a date or time.

article

The `DatePicker` view in SwiftUI allows users to select dates, times, or both. This view is particularly useful in forms, scheduling apps, and any situation where the user needs to input a date or time. SwiftUI provides several customization options to tailor the appearance and functionality of `DatePicker` to fit your app’s needs. In this article, we’ll explore how to create and customize `DatePicker`, handle its input, and integrate it into forms.


Creating a Simple DatePicker


Creating a `DatePicker` in SwiftUI is straightforward. You need to bind it to a state variable that tracks the selected date or time. Here’s an example of a basic `DatePicker`:



struct ContentView: View {
    @State private var selectedDate = Date()
    
    var body: some View {
        DatePicker("Select a date", selection: $selectedDate)
            .padding()
    }
}

In this example, the `DatePicker` is bound to the `selectedDate` state variable. The `DatePicker` defaults to showing both date and time, allowing users to select both. The label "Select a date" is displayed next to the picker.


Customizing DatePicker Appearance


SwiftUI provides several ways to customize the appearance and behavior of `DatePicker`. You can specify the displayed components, such as date only, time only, or both, using the `.datePickerStyle()` and `.displayedComponents()` modifiers.


Displaying Date Only


If you only want the user to select a date without the time, you can customize the `DatePicker` to show only the date component:



DatePicker("Select a date", selection: $selectedDate, displayedComponents: .date)
    .datePickerStyle(GraphicalDatePickerStyle())
    .padding()

In this example, the `displayedComponents` parameter is set to `.date`, which limits the picker to date selection only. The `GraphicalDatePickerStyle` displays the picker as a calendar view, which is visually appealing and user-friendly.


Displaying Time Only


Similarly, you can configure the `DatePicker` to allow only time selection by setting the `displayedComponents` to `.hourAndMinute`:



DatePicker("Select a time", selection: $selectedDate, displayedComponents: .hourAndMinute)
    .datePickerStyle(WheelDatePickerStyle())
    .padding()

In this example, the `DatePicker` is configured to display only the hour and minute components, allowing the user to select a time. The `WheelDatePickerStyle` presents the picker as a scrolling wheel, similar to the default time picker in iOS.


Restricting Date Range


In many scenarios, you might want to restrict the range of selectable dates. For instance, if you are building a booking system, you may want to limit date selection to a specific range. You can easily set a minimum and maximum date for the `DatePicker`:



let startDate = Calendar.current.date(byAdding: .day, value: -7, to: Date())!
let endDate = Calendar.current.date(byAdding: .day, value: 7, to: Date())!

DatePicker("Select a date", selection: $selectedDate, in: startDate...endDate, displayedComponents: .date)
    .padding()

In this example, the `DatePicker` is restricted to a date range from one week before today to one week after today. Users cannot select dates outside this range.


Handling DatePicker Input


When the user selects a date or time, SwiftUI automatically updates the bound state variable. You can also perform additional actions in response to the selection using the `.onChange()` modifier:



DatePicker("Select a date", selection: $selectedDate)
    .onChange(of: selectedDate) { newDate in
        print("Selected date: \(newDate)")
    }
    .padding()

In this example, whenever the user selects a new date, the new value is printed to the console. This approach is useful for triggering additional logic or updating the UI based on the selected date.


Integrating DatePicker into Forms


The `DatePicker` is often used in forms where users need to select dates for appointments, bookings, or events. SwiftUI’s `Form` view makes it easy to integrate `DatePicker` into a structured layout:



struct BookingView: View {
    @State private var bookingDate = Date()
    
    var body: some View {
        Form {
            Section(header: Text("Booking Details")) {
                DatePicker("Select booking date", selection: $bookingDate, displayedComponents: .date)
            }
        }
    }
}

In this example, the `DatePicker` is placed within a `Form` and grouped under a "Booking Details" section. This setup is typical for apps that require users to enter date-related information in a structured and user-friendly manner.


instructor

Exodai INSTRUCTOR!

Johan t'Sas

Owner and Swift developer!