UIDatePicker,根据今天的日期设置最大和最小日期。

46

如果我有一个UIDatePicker,希望将最小和最大日期范围设置为30年前到未来的30年之间,我该如何设置?

8个回答

90

没有经过测试,但你可能想要类似于这样的东西。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:30];
NSDate *maxDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[comps setYear:-30];
NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];

[datePicker setMaximumDate:maxDate];
[datePicker setMinimumDate:minDate];

更新至Swift 4.1版本

let calendar = Calendar(identifier: .gregorian)
var comps = DateComponents()
comps.year = 30
let maxDate = calendar.date(byAdding: comps, to: Date())
comps.year = -30
let minDate = calendar.date(byAdding: comps, to: Date())
datePicker.maximumDate = maxDate
datePicker.minimumDate = minDate

如果你同时有日期和月份列,它不会出现混乱吗?在当前形式下,它将限制月份和日期为当前日期。比如今天是2015年6月3日,年份没问题,但日期将被固定在最大值3,月份将被固定在最大值6月。 - NSNoob
不是。你只是盲目猜测吗? - warrenm
不,我在我正在开发的应用程序中尝试过那个方法,但我遇到了我告诉你的问题。最终,我不得不单独对日期进行检查。 - NSNoob
我刚在iOS 8上尝试了一下,将datePickerMode设置为UIDatePickerModeDate,它按预期工作。我不知道你的实现可能出了什么问题,但你可能想把它作为一个单独的问题发布。 - warrenm
我已经为Swift 4.1创建了一个扩展程序,请从以下链接中查找:https://dev59.com/YGkv5IYBdhLWcg3wlRxc#50580289 - g212gs

19
m_datePicker.maximumDate = [NSDate date];

您可以使用以下代码行来设置最大日期(今天)。


我该如何隐藏日期>maximumDate? - alex
1
实际上,这将把最大日期设置为执行该行代码的确切分钟。 - Juan Boero
它不允许选择今天之后的日期,但用户已经看到了以后的日期。 - Onur Tuna

6

我对@toddg的Swift 4版本如下:

let currentDate = Date()
var dateComponents = DateComponents()
let calendar = Calendar.init(identifier: .gregorian)
dateComponents.year = -100
let minDate = calendar.date(byAdding: dateComponents, to: currentDate)
dateComponents.year = -13
let maxDate = calendar.date(byAdding: dateComponents, to: currentDate)

对我来说效果很好!

6

将最大日期设为今天 Swift 4.2

datePicker.maximumDate = Date()

3

将@warrenm的答案改为Swift版本:

let currentDate = NSDate()
let dateComponents = NSDateComponents()
dateComponents.year = -13
let minDate = calendar.dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))
dateComponents.year = 30
let maxDate = calendar.dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))


dobPicker.maximumDate = maxDate
dobPicker.minimumDate = minDate

2

今天我看到了这个问题,并想出了一种Swift 3的解决方案,它扩展了UIDatePicker。

extension UIDatePicker
{
    /// set the date picker values and set min/max
    /// - parameter date: Date to set the picker to
    /// - parameter unit: (years, days, months, hours, minutes...)
    /// - parameter deltaMinimum: minimum date delta in units
    /// - parameter deltaMaximum: maximum date delta in units
    /// - parameter animated: Whether or not to use animation for setting picker
    func setDate(_ date:Date, unit:NSCalendar.Unit, deltaMinimum:Int, deltaMaximum:Int, animated:Bool)
    {
        setDate(date, animated: animated)

        setMinMax(unit: unit, deltaMinimum: deltaMinimum, deltaMaximum: deltaMaximum)
    }

    /// set the min/max for the date picker (uses the pickers current date)
    /// - parameter unit: (years, days, months, hours, minutes...)
    /// - parameter deltaMinimum: minimum date delta in units
    /// - parameter deltaMaximum: maximum date delta in units
    func setMinMax(unit:NSCalendar.Unit, deltaMinimum:Int, deltaMaximum:Int)
    {
        if let gregorian = NSCalendar(calendarIdentifier:.gregorian)
        {
            if let minDate = gregorian.date(byAdding: unit, value: deltaMinimum, to: self.date)
            {
                minimumDate = minDate
            }

            if let maxDate = gregorian.date(byAdding: unit, value: deltaMaximum, to: self.date)
            {
                maximumDate = maxDate
            }
        }
    }
}

setDate方法会设置UIDatePicker实例的三个值(日期、最小值、最大值)。

setMinMax仅设置最小值和最大值。最小值和最大值是使用选择器的当前日期计算得出的。

单位可以是以下值之一:

  • .year(年)
  • .month(月)
  • .day(日)
  • .hour(小时)
  • .minute(分钟)
  • .second(秒)

要将日期设置为加上或减去30年,代码应为:

var datePicker = UIDatePicker()
var date = Date()

datePicker.setDate(date, unit:.year, deltaMinimum:-30, deltaMaximum:30, animated:true)

1
请尝试这段代码 Ios8+
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:30];
NSDate *maxDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[comps setYear:-30];
NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];

[datePicker setMaximumDate:maxDate];
[datePicker setMinimumDate:minDate];

0

将最小日期设置为今天的日期

@IBOutlet var datePicker: UIDatePicker!

datePicker.minimumDate = NSDate() as Date

这将使日期选择器自动滚动到当前日期,即使已滚动到较早的日期。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接