#objective-c #macos #cocoa
#objective-c #macos #cocoa
Вопрос:
Я использую NSDatePicker в своем приложении, но в моем средстве выбора даты нет нуля в дате / месяце / часе / etc в качестве средства выбора даты iCal. Вы можете увидеть разницу, о которой я говорил в выделенной части двух следующих изображений.
Это средство выбора даты в iCal:
и это средство выбора даты в моем приложении:
Не могли бы вы сказать мне, пожалуйста, как настроить форматер, подобный iCal?
Комментарии:
1. Наконец, я нашел ответ, мне нужно изменить язык NSDatePicker
2. Как получить начальные нули, изменив NSLocale? Я понимаю только, как изменить локаль на другую страну или язык.
3. У меня такая же проблема. Я перепробовал много разных локализаций и в итоге выбрал Армению для красивого норвежского формата. Я не знаю, почему код на норвежском языке должен запускать начальный пробел в датах, поскольку они никогда не используются. Похоже на ошибку, если ее не исправить. Как изменить формат, используемый NSDatePicker — поскольку setDateFormatter не имеет никакого эффекта.
4. не могли бы вы полностью ответить на свой собственный вопрос, теперь, когда вы его решили? Какой язык вы используете для NSDatePicker и как вы его настраиваете? Кроме того, есть ли способ указать средству выбора даты использовать формат панели системных настроек даты и времени?
5. Здесь то же самое… :/
Ответ №1:
Apple использует частный метод на NSDatePicker
, чтобы принудительно отображать начальные нули независимо от локали. Вы также можете сделать это, хотя это может не очистить обзор в Mac App Store.
Да, вы могли бы принудительно установить языковой стандарт, который всегда показывает двузначное поле дня, но тогда некоторые пользователи увидели бы неправильный порядок полей или разделитель для своего языка.
Для Calendar.app / iCal мы можем посмотреть CalendarUI.framework
в Hopper и посмотреть, где они вызывают частный метод _setForcesLeadingZeros:
.
Вы можете вызвать частный метод с помощью…
let sel = Selector(("_setForcesLeadingZeroes:"))
let imp = class_getMethodImplementation(NSDatePicker.self, sel)
let impClosure = unsafeBitCast(
imp,
to: (@convention(c)(Any?, Selector?, Bool) -> Void).self)
impClosure(datePicker, sel, true)
Комментарии:
1.
datePicker.setValue(true, forKey: "forcesLeadingZeroes")
также делает свое дело.
Ответ №2:
Используйте метод экземпляра NSDatePicker setDatePickerStyle:
- (void)setDatePickerStyle:(NSDatePickerStyle)newStyle
Комментарии:
1. В NSDatePickerStyle есть три варианта, и я использовал NSTextFieldDatePickerStyle, потому что мне не нужен шаговый или календарь / часы. Но мне не повезло.