简体   繁体   中英

Swift Datepicker with minimum date

Goord Morning all together,

i have an app with ios 8 and swift. in there is a UIViewcontroller within a UIDatepicker

I set a minimum date. for example the date of today: 2 | May | 2015 with this solution it should not be possible to set a date which is in the past

but if would like to set this date 15 | January | 2016 i set at first the day to 15 than the month to january but then the UIDatepicker goes back to the minimum date 2 May 2015

is it be possible, that wenn change the day to 15 and the month to january, that the year changes automaticly to 2016?

Let your minimumDate unset and try to configure it by code...

Try this:

@IBAction func changeValue(sender: UIDatePicker) 
{

    //Get time Now, and convert to a NSCalendar
    //Specify the minimun date if you want.
    let now = NSDate()
    let nowCalendar = NSCalendar.currentCalendar()
    let nowComponents = nowCalendar.components([.Day, .Month, .Year], fromDate: now)

    //Compare if date is lesser than now and then create a new date
    if nowCalendar.compareDate(sender.date, toDate: now, toUnitGranularity: [.Day, .Month, .Year]) == NSComparisonResult.OrderedAscending
    {

        let dateCalendar = NSCalendar.currentCalendar()
        let dateComponents = dateCalendar.components([.Day, .Month, .Year], fromDate: sender.date)

        dateComponents.year = nowComponents.year + 1
        let newDate = dateCalendar.dateFromComponents(dateComponents)
        sender.date = newDate!
    }

}
///Swift4 Version - I think it may works with 3 too.
@IBAction func changeValue(sender: UIDatePicker)
{

    //Get time Now, and convert to a NSCalendar
    //Specify the minimun date if you want.
    let now = Date()
    let nowCalendar = Calendar.current
    let nowComponents = nowCalendar.dateComponents([.day, .month, .year], from: now)

    //Compare if date is lesser than now and then create a new date
    if nowCalendar.compare(sender.date, to: now, toGranularity: Calendar.Component.day) == ComparisonResult.orderedAscending
    {
        var dateCalendar = Calendar.current
        var dateComponents = dateCalendar.dateComponents([.day, .month, .year], from: sender.date)

        guard let year = nowComponents.year else { return }

        dateComponents.year = year + 1
        let newDate = dateCalendar.date(from:dateComponents)
        sender.date = newDate!
    }
}

I published a complete example working in playground if you wish to play a little. https://gist.github.com/dedeexe/4878f78d7e1d5fe8b372ef84de629b59

For swift 4:

I have like this. 1. My function:

func AddDaysToToday(days: Int) -> Date? {
    var dateComponents = DateComponents()
    dateComponents.day = days

    return Func.GetCalendar(tz: .utc).date(byAdding: dateComponents, to: Date()) //you can return your own Date here.
}
  1. In my VC:

     let today = DateFunc.AddDaysToToday(days: 0) datePicker.minimumDate = today 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM