Обновление расширения Swift Keyboard NSUserDefaults

Я пытаюсь сделать расширение клавиатуры iOS, но у меня возникают проблемы с синхронизацией/обновлением данных из содержащего приложения в расширение.

Как говорится в документе, я использую

NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyShareExtension"];
[mySharedDefaults setObject:theAccountName forKey:@"lastAccountName"];

Это работает отлично. Прежде чем запускать клавиатуру в содержащем приложении, я использую это, а в viewdidLoad клавиатуры я проверяю NSUserDefault, и все работает нормально.

Проблема в том, что если в моем содержащем приложении я обновляю свои NSUserDefaults, как я могу узнать в своем приложении клавиатуры, что NSUserDefaults были обновлены.

Пробовал КВО, не работает. Пробовал NSUserDefaultsStandard с NSUserDidChangeNotification, не работает. NSUserDefaultsStandard вообще не работает для расширения клавиатуры.

Я думал об использовании NSTimer в расширении клавиатуры и проверял NSUserDefaults каждые X мс. Но это перебор.

Я знаю, что это возможно, поскольку приложения делают это в AppStore. BrightKey или CoolKey меняют дизайн клавиатуры из содержащего приложения. Так что у них определенно есть обратный вызов или что-то еще, чтобы обновить свои данные.

Заранее спасибо всем, кто предложит чистое решение.


person Mehdi.Sqalli    schedule 01.10.2014    source источник


Ответы (2)


Вы можете читать/записывать значения по умолчанию для общего пользователя каждый раз, когда ваша клавиатура и содержащее приложение загружаются.

person nurnachman    schedule 03.10.2014
comment
Да, но я хотел бы сделать это, не дожидаясь загрузки. Например, приложения BrightKey и CoolKey меняют дизайн клавиатуры вживую, не перезагружая их. - person Mehdi.Sqalli; 03.10.2014
comment
Они показывают клавиатуру, когда вы выбираете тему. Они делают флекси-трюк: когда клавиатура загружена, они вводят очень быстрый текстовый идентификатор в текстовое поле, которое клавиатура распознает и сохраняет локально. - person nurnachman; 03.10.2014
comment
Можете ли вы быть более явным? Как клавиатура получает доступ к текстовому идентификатору? Как теперь идентификатор только что изменился, чтобы они могли загружать тему в режиме реального времени? - person Mehdi.Sqalli; 03.10.2014

Трюк Mt:

Просто добавьте UITextField в содержащее приложение и установите свойство Hidden On, чтобы текстовое поле было невидимым.

После того, как пользователь выбрал любую тему, просто вызовите textView.becomeFirstResponder(), чтобы казалось, что вы загрузили клавиатуру после выбранной пользователем темы. после того, как пользователь выбрал другую тему, просто вызовите textView.resignFirstResponder() и подождите около 0,6 секунды (чтобы NSUserDefaults обновился), а затем снова вызовите textView.becomeFirstResponder(), и ваша клавиатура загрузится с новой темой! :)

person Reza_Rg    schedule 03.10.2014
comment
Это мой текущий трюк. Но если вы проверите 2 приложения, которые я упомянул, они не используют этот трюк, поскольку клавиатура никогда не уходит в отставку. Немного некрасиво, когда клавиатура исчезает и возвращается после небольшой задержки... - person Mehdi.Sqalli; 04.10.2014