如何防止在 swift 的 UIPicker 视图中选择无效日期?
How to prevent the selection of invalid dates in UIPicker view in swift?
我正在使用 UIPicker 视图显示日期、日期和时间,如下图所示:
我已经使用以下代码实现了这个:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource {
@IBOutlet weak var txtDatePicker: UITextField!
@IBOutlet var dateLabel:UILabel!
let datePicker = UIPickerView()
var pickerDaysYear = [["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"],["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],["1AM", "2AM", "3AM", "4AM", "5AM", "6AM", "7AM", "8AM", "9AM", "10AM", "11AM", "12AM","1PM", "2PM", "3PM", "4PM", "5PM", "6PM", "7PM", "8PM", "9PM", "10PM", "11PM", "12PM",]];
override func viewDidLoad() {
super.viewDidLoad()
self.txtDatePicker.delegate = self
self.datePicker.dataSource = self
self.datePicker.delegate = self
self.txtDatePicker.inputView = self.datePicker
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.plain, target: self, action: #selector(self.doneButtonTapped))
toolBar.setItems([doneButton], animated: false)
self.txtDatePicker.inputAccessoryView = toolBar
}
@objc func doneButtonTapped(){
self.txtDatePicker.resignFirstResponder()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//---------------- PickerView delegate Method --------------------------------//
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 3
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.pickerDaysYear[component].count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.pickerDaysYear[component][row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let days = pickerDaysYear[0][pickerView.selectedRow(inComponent: 0)]
let month = pickerDaysYear[1][pickerView.selectedRow(inComponent: 1)]
let time = pickerDaysYear[2][pickerView.selectedRow(inComponent: 2)]
txtDatePicker.text = days + " " + month + " " + time
}
}
我已经达到了预期的输出,但问题是我仍然可以 select 无效日期,例如“2 月 30 日”、“4 月 31 日”等...那么有什么方法可以通过select编了??。
现在输出就像:
在公历中,每四年有一个闰年。还有其他规则可以确定给定年份是否为闰年。基于 this web site,我创建了以下 class (MyDate.swift).
import Foundation
class MyDate: NSObject {
var year: Int
var month: Int
var day: Int
init(year: Int, month: Int, day: Int) {
self.year = year
self.month = month
self.day = day
}
func validateDate() -> Bool {
if month == 4 || month == 6 || month == 9 || month == 11 {
return (day == 30) ? true : false
}
else if month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 {
return (day == 31) ? true : false
}
else {
if isLeapYear(year: year) {
return (day < 30) ? true : false
} else {
return (day < 29) ? true : false
}
}
}
func isLeapYear(year: Int) -> Bool {
let mod4 = year % 4
if mod4 == 0 {
let mod100 = year % 100
if mod100 == 0 {
let mod400 = year % 400
if mod400 == 0 {
return true
} else {
return false
}
} else {
return true
}
} else {
return false
}
}
}
如何使用 MyDate
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
override func viewDidLoad() {
super.viewDidLoad()
let myDate = MyDate(year: 2020, month: 3, day: 32)
let bool = myDate.validateDate()
print(bool) // false
}
}
用给定的年月日实例化 MyDate。然后 return 一个带有 validateDate 方法的 bool 对象。所以当用户选择日期时,在UIPicker
的didSelectRow
方法中实例化MyDate。如果 validateDate returns 为 false,则将月中的第几天设置为 1 或其他内容。
txtDatePicker.selectRow(0, inComponent: 0, animated: false)
我正在使用 UIPicker 视图显示日期、日期和时间,如下图所示:
我已经使用以下代码实现了这个:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource {
@IBOutlet weak var txtDatePicker: UITextField!
@IBOutlet var dateLabel:UILabel!
let datePicker = UIPickerView()
var pickerDaysYear = [["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"],["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],["1AM", "2AM", "3AM", "4AM", "5AM", "6AM", "7AM", "8AM", "9AM", "10AM", "11AM", "12AM","1PM", "2PM", "3PM", "4PM", "5PM", "6PM", "7PM", "8PM", "9PM", "10PM", "11PM", "12PM",]];
override func viewDidLoad() {
super.viewDidLoad()
self.txtDatePicker.delegate = self
self.datePicker.dataSource = self
self.datePicker.delegate = self
self.txtDatePicker.inputView = self.datePicker
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.plain, target: self, action: #selector(self.doneButtonTapped))
toolBar.setItems([doneButton], animated: false)
self.txtDatePicker.inputAccessoryView = toolBar
}
@objc func doneButtonTapped(){
self.txtDatePicker.resignFirstResponder()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//---------------- PickerView delegate Method --------------------------------//
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 3
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.pickerDaysYear[component].count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.pickerDaysYear[component][row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let days = pickerDaysYear[0][pickerView.selectedRow(inComponent: 0)]
let month = pickerDaysYear[1][pickerView.selectedRow(inComponent: 1)]
let time = pickerDaysYear[2][pickerView.selectedRow(inComponent: 2)]
txtDatePicker.text = days + " " + month + " " + time
}
}
我已经达到了预期的输出,但问题是我仍然可以 select 无效日期,例如“2 月 30 日”、“4 月 31 日”等...那么有什么方法可以通过select编了??。 现在输出就像:
在公历中,每四年有一个闰年。还有其他规则可以确定给定年份是否为闰年。基于 this web site,我创建了以下 class (MyDate.swift).
import Foundation
class MyDate: NSObject {
var year: Int
var month: Int
var day: Int
init(year: Int, month: Int, day: Int) {
self.year = year
self.month = month
self.day = day
}
func validateDate() -> Bool {
if month == 4 || month == 6 || month == 9 || month == 11 {
return (day == 30) ? true : false
}
else if month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 {
return (day == 31) ? true : false
}
else {
if isLeapYear(year: year) {
return (day < 30) ? true : false
} else {
return (day < 29) ? true : false
}
}
}
func isLeapYear(year: Int) -> Bool {
let mod4 = year % 4
if mod4 == 0 {
let mod100 = year % 100
if mod100 == 0 {
let mod400 = year % 400
if mod400 == 0 {
return true
} else {
return false
}
} else {
return true
}
} else {
return false
}
}
}
如何使用 MyDate
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
override func viewDidLoad() {
super.viewDidLoad()
let myDate = MyDate(year: 2020, month: 3, day: 32)
let bool = myDate.validateDate()
print(bool) // false
}
}
用给定的年月日实例化 MyDate。然后 return 一个带有 validateDate 方法的 bool 对象。所以当用户选择日期时,在UIPicker
的didSelectRow
方法中实例化MyDate。如果 validateDate returns 为 false,则将月中的第几天设置为 1 或其他内容。
txtDatePicker.selectRow(0, inComponent: 0, animated: false)