我有一个日期选择器,用户可以在其中选择他们的出生日期。我设置了一个最长日期,因此 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 年前。
我想保留用户选择的日期和月份,仅重置年份。
我尝试使用 if
情况捕获 didSelectDate
方法中的无效日期,但它一直失败。我的计划是从 sender.date
中提取日期和月份(如果它是无效日期),然后使用该日期、月份加上最大日期的年份创建一个新的日期对象作为新的日期对象并将其设置为当前日期。但无法确定无效日期让我感到困惑。
最佳答案
我认为有两种方法可以只改变年份。
根据 @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
}
关于ios - 仅重置 UIDatePicker 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51483081/