如何自定义UIDatePicker实现如下输出?

How to customise UIDatePicker to achieve the following output?

这是一个包含天、日期和月份作为输入的选择器,同样,在一个滚动中,有什么方法可以实现 picker/datepicker 和 iOS 中的这种功能?

执行以下步骤:-
1. 您必须通过申请 DateFormatter() 来更改日期。
2. 将所有日期(字符串格式)保存在 NSArrayNSMutableArray 中,用于 UIPickerView Datasource 方法。
3. 然后调用 UIPickerView DatasourceDelegate 方法来获取结果。

对于日期转换,您可以应用以下代码。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEE dd MMM"
let currentDate = NSDate()

let convertedDateString = dateFormatter.string(from:currentDate as Date)
print("convertedDate: ", convertedDateString)

对于这种情况,您应该将其添加为 UIPickerView。假设问题是:如何按当月的天数填充它的值?为了更清楚,我将其作为步骤提及:

  • 您应该得到当前月份 开始结束 日期。您可以通过检查 .

  • 找到实现方法
  • 您需要获取开始日期和结束日期之间的所有日期 - 具有所需的格式。您可以通过检查 .

  • 找到实现方法
  • 获取当月所有天数后,即可轻松填写日期选择器数据源方法

实施:

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    var currentMonthDays: [String] {
        var array = [String]()

        var date = Date().startOfMonth() // first date
        let endDate = Date().endOfMonth()

        let fmt = DateFormatter()
        //fmt.dateFormat = "dd/MM/yyyy"
        fmt.dateFormat = "EEE dd MMM"

        while date <= endDate {
            date = Calendar.current.date(byAdding: .day, value: 1, to: date)!

            array.append(fmt.string(from: date))
        }

        return array
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(currentMonthDays)
    }

    // Picker View Data Soruce & delegate Methods

    // REMARK: make sure to connect pickerview datasource/delegate to your view controller,
    // I did it from the storyboard
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return currentMonthDays.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return currentMonthDays[row]
    }
}


// Step #1:
extension Date {
    func startOfMonth() -> Date {
        return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!
    }

    func endOfMonth() -> Date {
        return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())!
    }
}