簡體   English   中英

如何防止在 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

}
}

我已經實現了所需的 output 但問題是我仍然可以 select 無效日期,如“2 月 30 日”“4 月 31 日”等......那么有沒有辦法通過選擇來防止這種無效日期? 現在 output 就像:

日期選擇無效

在公歷中,每四年有一個閏年。 還有其他規則可以確定給定年份是否為閏年。 基於這個 web 站點,我創建了以下 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
        }
    }
}

如何使用我的日期

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。 然后返回 bool object 及其 validateDate 方法。 所以當用戶選擇一個日期時,在UIPickerdidSelectRow方法中實例化 MyDate 。 如果 validateDate 返回 false,請將日期設置為 1 或其他值。

txtDatePicker.selectRow(0, inComponent: 0, animated: false)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM