Невозможно отобразить «Сегодня» вместо сегодняшней даты после того, как Пользователь выбрал дату - PullRequest
1 голос
/ 18 апреля 2020

Я делаю журнальное приложение, в котором пользователь может редактировать метку даты и времени. Когда пользователь нажимает на ярлык, он вызывает UIDatePicker. Я хочу сделать так, чтобы при сохранении даты, а также для «сегодня», ярлык не обновлялся для отображения сегодняшней даты, а вместо этого отображал слово «сегодня». Это то, что я видел в Календаре, Журнале, Фитнесе и любом другом приложении, которое позволяет пользователю редактировать дату записи в журнале.

Правильно отображается, когда пользователь первоначально открывает представление и видит текущую дату и время (программный c пользовательский интерфейс):

let dateTimePicker: UIDatePicker = {
    let picker = UIDatePicker()
        picker.datePickerMode = .dateAndTime
        picker.timeZone = NSTimeZone.local
        picker.backgroundColor = UIColor.white
    return picker
}()

let dateTimeLabel: UILabel = {
    let now = Date()
    let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_US")
        dateFormatter.setLocalizedDateFormatFromTemplate("h:mm")
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
        label.attributedText = NSAttributedString(string: "Today, " + dateFormatter.string(from: now), attributes:[.underlineStyle: NSUnderlineStyle.single.rawValue])

    return label
}()

Средство выбора даты открывается как всплывающее окно. Когда пользователь нажимает кнопку «Отмена», дата и время остаются неизменными. Когда пользователь изменяет дату и / или время и нажимает «Сохранить», dateTimeLabel обновляется соответствующим образом. Однако, если отображается «Сегодня, ___» и пользователь нажимает «Сохранить», ярлык обновляет его до текущей даты.

Вот что я пробовал:

@objc func saveTapped() {
        let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale(identifier: "en_US")

        let now = Date()
        if dateTimePicker.date == now {
            dateFormatter.setLocalizedDateFormatFromTemplate("h:mm")
            dateTimeLabel.text = "Today, " + dateFormatter.string(from: now)
        } else {
            dateFormatter.setLocalizedDateFormatFromTemplate("MMMd h:mm")
            dateTimeLabel.text = dateFormatter.string(from: dateTimePicker.date)
        }

        removePopoverView()
    }

Gif, чтобы показать, что он в данный момент делает (я хочу, чтобы он отображал «Сегодня» вместо «17 апреля» на dateTimeLabel, когда пользователь нажимает «Сохранить» https://makeagif.com/i/v9mrKs

1 Ответ

3 голосов
/ 18 апреля 2020

Вы можете использовать метод Calendar isDateInToday, чтобы проверить, совпадает ли дата с сегодняшним днем:

if Calendar.current.isDateInToday(dateTimePicker.date) {
    // your code ...
} else if Calendar.current.isDateInYesterday(dateTimePicker.date) {
    // your code ...
} else {
    // your code ...
}

Обратите внимание, что DateFormatter имеет свойство с именем doesRelativeDateFormatting именно для этой цели. Вам просто нужно установить его в true, и он позаботится об этом с преимуществом отображения локализованной строки:


let date1 = DateComponents(calendar: .current, year: 2020, month: 4, day: 18, hour: 1).date!
let date2 = DateComponents(calendar: .current, year: 2020, month: 4, day: 17, hour: 23).date!

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
dateFormatter.doesRelativeDateFormatting = true

dateFormatter.string(for: date1)  // "Today at 1:00 AM"
dateFormatter.string(for: date2)  // "Yesterday at 11:00 PM"
...