仅重置UIDatePicker的一部分

时间:2018-07-23 16:07:02

标签: ios swift date uidatepicker

我有一个日期选择器,用户可以在其中选择自己的出生日期。我设置了一个最大日期,这样2000年以后出生的用户将无法使用该应用程序。下面是我的代码。

class ViewController: UIViewController {
    @IBOutlet weak var datePicker: UIDatePicker!

    override func viewDidLoad() {
        super.viewDidLoad()

        datePicker.maximumDate = Date.earliestValidDate
        datePicker.date = Date.initialDate
    }

    @IBAction func didSelectDate(_ sender: UIDatePicker) {
        if sender.date > Date.earliestValidDate {
            print("Invalid date!")
            return
        }
        print(DateFormatter.localizedString(from: sender.date, dateStyle: .medium, timeStyle: .none))
    }

}

extension Date {
    public static var earliestValidDate: Date {
        let calendar = Calendar(identifier: .gregorian)
        return calendar.date(byAdding: .year, value: -18, to: Date())!
    }

    public static var initialDate: Date {
        var components = DateComponents()
        components.year = 1995
        components.month = 1
        components.day = 1

        let calendar = Calendar(identifier: .gregorian)
        return calendar.date(from: components)!
    }
}

我的问题与可用性有关。假设用户选择了日期和月份,并且在选择年份时选择了无效的年份。然后,整个选择器将重置为当前日期。这是可以解释的,因为我将当前日期设置为18年前的最大日期。

enter image description here

我要保留用户选择的日期,而月份只重置年份。

我尝试在didSelectDate情况下使用if方法捕获无效日期,但这种情况一直存在。我的计划是从sender.date中提取日期和月份(如果它是无效的日期),然后创建一个具有该日期,月份和最大日期的年份作为新日期对象的新日期对象,并将其设置为当前的日期。但是我无法确定无效的日期。

Sample project

1 个答案:

答案 0 :(得分:0)

我认为只有两种更改年份的方法。

根据@Larme的解释,没有设置最小/最大日期;选择无效的日期后检查并更改最大年份。

extension UIDatePicker {

    public func checkMaxYear() {
        let calendar = Calendar(identifier: .gregorian)
        var component = calendar.dateComponents([.day,.month], from: self.date)
        component.year = calendar.dateComponents([.year], from: Date.earliestValidDate).year
        let newDate = calendar.date(from: component)!
        self.setDate(newDate, animated: true)
    }
}

//Call checkMaxYear() extension when invalid date

if sender.date > Date.earliestValidDate {
    print("Invalid date!")
    datePicker.checkMaxYear()
    return
}

另一种方法是每当用户在datePicker中更改日/月/年时设置最大日期

func changeMaximumDate() {

    let calendar = Calendar(identifier: .gregorian)
    var component = calendar.dateComponents([.day,.month], from: self.datePicker.date)
    component.year = calendar.dateComponents([.year], from: Date.earliestValidDate).year
    component.month = component.month
    component.day = component.day

    datePicker.maximumDate = calendar.date(from: component)!

}

@IBAction func didSelectDate(_ sender: UIDatePicker) {

    //Change maximum date
    changeMaximumDate()

    //...rest code
}