2010-03-07 2 views
2

У меня есть пара NSTextFields в моем приложении для ввода даты и времени. Они имеют NSDateFormatters (используя NSDateFormatterBehavior10_4), прикрепленные к ним.Сделать отключенным, отформатированное обновление NSTextField при изменении локали?

При изменении формата системной даты в Системных настройках, затем вернитесь в мое приложение, текстовые поля автоматически обновятся с новым форматом даты, но только если они включены. Если они отключены, ничего не происходит, пока я не включу и не закрою их.

Как я могу инициировать это обновление форматирования, даже если поле отключено? Я попытался установить значение объекта самому себе и использовать setNeedsDisplay, но не работает.

+0

Существуют ли какие-либо из ваших форматировщиков, используемые двумя полями, одна из которых включена, а другая нет? Если да, то что происходит в каждом из этих полей? –

+0

Нет, каждый форматировщик используется одним полем. Если вы хотите поиграть с ним - http://sabi.net/temp/PesterSL.zip (источник на http://github.com/nriley/Pester) - поля, о которых я говорю, - это «на» и «на», на". –

ответ

0

Моя проблема связана с конкретным уведомлением, которое я использовал для обнаружения изменения формата.

Когда AppleDatePreferencesChangedNotification был доставлен, местонахождение не обновлялось, поэтому независимо от того, что я пробовал, Cocoa обновлял поле, используя старую информацию о локали. После небольшой задержки локаль обновляется, и все работает нормально.

Я думаю, что именно поэтому NSCurrentLocaleDidChangeNotification был добавлен в 10.5, но поскольку я поддерживаю обратно до 10.4, я воспользуюсь этим обходным решением пока.

NSDistributedNotificationCenter *distributedNotificationCenter = [NSDistributedNotificationCenter defaultCenter]; 
    [distributedNotificationCenter addObserver: self selector: @selector(_dateFormatsChanged:) name: @"AppleDatePreferencesChangedNotification" object: nil]; 

// ... 

- (void)_localeChanged; 
{ 
    // ... update stuff ... 
} 

- (void)_dateFormatsChanged:(NSNotification *)notification; 
{ 
    // XXX delay while NSLocale updates - can we use another notification instead? 
    // XXX 10.5+ has NSCurrentLocaleDidChangeNotification 
    [self performSelector: @selector(_localeChanged) withObject: nil afterDelay: 0.1]; 
} 
+0

FWIW, так как я потерял поддержку до 10.6, теперь NSCurrentLocaleDidChangeNotification отлично работает и (как следует из названия) отправляется после завершения изменения локали. Обратите внимание, что для этого вы хотите использовать NSNotificationCenter, а не NSDistributedNotificationCenter. –

Смежные вопросы