Можно ли отформатировать UIDatePicker? - PullRequest
0 голосов
/ 04 февраля 2019

Интересно, можно ли отформатировать UIDatePicker?

Мне бы хотелось, чтобы рабочие дни до даты были в виде строки, например, «Понедельник 01.01.2018».Я видел это много раз, но ничего не нашел.

В настоящее время отображается только дата без дня недели до нее.

Я искал везде, но не нашел ответа.

1 Ответ

0 голосов
/ 04 февраля 2019

Если вы показываете только дату и хотите видеть день недели, возможно, вам придется внедрить свой собственный UIPickerView.

Например, это создает однокомпонентный сборщик.И, поскольку в зависимости от того, где вы живете, 01.02.2019 можно интерпретировать как 2 января или 1 февраля, я мог бы предложить локализованный формат, например EEEMMMdyyyy, который является кратким, локализованным и однозначным:

class ViewController: UIViewController {

    @IBOutlet weak var pickerView: UIPickerView!

    private var startDate: Date!
    private var endDate: Date!

    private let formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.setLocalizedDateFormatFromTemplate("EEEMMMdyyyy")
        return formatter
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        configurePicker()
    }

    func configurePicker() {
        // you can also hook up delegate and datasource in IB if you prefer

        pickerView.dataSource = self
        pickerView.delegate = self

        // set the range of dates to whatever is appropriate for your app

        let now = Date()
        startDate = now
        endDate = Calendar.current.date(byAdding: .year, value: 1, to: now)
    }

}

extension ViewController: UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return Calendar.current.dateComponents([.day], from: startDate, to: endDate).day!
    }
}

extension ViewController: UIPickerViewDelegate {
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        let date = Calendar.current.date(byAdding: .day, value: row, to: startDate)!
        return formatter.string(from: date)
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let date = Calendar.current.date(byAdding: .day, value: row, to: startDate)!
        print(formatter.string(from: date))
    }
}

Это дает (для пользователя в США):

enter image description here

Теперь, если вы хотите иметь как пользовательский формат строки даты, так и несколько компонентов (например, день,Месяц и год в виде отдельных столбцов), становится все более запутанным (потому что вы должны делать такие вещи, как корректировка диапазона значений дня при смене месяца), но идея будет такой же.Просто создайте свой собственный UIPickerView (или поищите во внешних сетях сторонние решения).

...