Date Pickers

ViewController

Ready-to-use date picker modals that extend TTBasePopupViewController. TTBaseDatePicker wraps Apple's UIDatePicker in a card with Cancel/Select buttons. TTBaseMonthYearPicker provides a month+year-only picker for card expiry inputs.


πŸ“… TTBaseDatePicker

// Date-only picker (default)
let picker = TTBaseDatePicker(
    with: true,          // tap outside to dismiss
    selectedDate: Date(),
    mode: .date
)
picker.didTouchOKButton = { [weak self] selectedDate in
    self?.dateLabel.text = DateFormatter.display.string(from: selectedDate)
}
picker.didTouchCancelButton = { /* optional */ }
present(picker, animated: true)

// Date + Time picker
let dateTimePicker = TTBaseDatePicker(
    with: false,
    selectedDate: event.startDate,
    mode: .dateAndTime,
    textColor: .darkText
)

// Time only
let timePicker = TTBaseDatePicker(
    with: true,
    selectedDate: Date(),
    mode: .time
)

// Custom colors
picker.setColor(
    withPanel: .white,
    text: .darkText,
    leftButton: .systemGray,
    rightButton: .systemBlue
)

// Custom button labels
picker.setText(forLeftButton: "Huỷ", right: "Chọn")

// Hide buttons (display only)
picker.setHiddenButton()

// Hide just cancel
picker.setHiddenCancelButton()

// Real-time change
picker.didDatePickerValueChanged = { date in
    print("Picker moved to:", date)
}

πŸ“– API Reference

MemberTypeDescription
init(with:selectedDate:mode:textColor:)InitPrimary initializer
didDatePickerValueChanged(Date) β†’ VoidCalled on every wheel change
didTouchCancelButton() β†’ VoidCancel button tapped
didTouchOKButton(Date) β†’ VoidOK/Select button tapped with final date
setText(forLeftButton:right:)MethodLocalize button labels
setColor(withPanel:text:leftButton:rightButton:)MethodFully customize colors
setHiddenButton()MethodHide both buttons
setHiddenCancelButton()MethodHide cancel only
modeUIDatePicker.Mode.date / .time / .dateAndTime
Pro Tip: Use didTouchOKButton rather than didDatePickerValueChanged in forms β€” didDatePickerValueChanged fires for every wheel movement, potentially causing repeated UI updates. Only commit the selection in the OK handler.