Тумблер настроек iOS работает в первый раз, но не снова

Я использую приложение настроек iPad, чтобы изменить некоторые звуки кнопок и фоновое изображение. Все работает хорошо, и настройки сохраняются от одного запуска приложения к другому в симуляторе. Теперь я реализовал тумблер для включения или выключения наборов звуков. Когда приложение запускается, в каком бы состоянии ни был переключатель, он работает; например если переключатель «Звуки предупреждений» выключен, звуки предупреждений тихие, и если я переведу его в положение ВКЛ, звуки начнут работать. Однако, если я снова выключу переключатель, звуки все еще будут работать. Однако, если состояние включено при запуске приложения, звуки работают, но не будут отключены, когда переключатель установлен в положение ВЫКЛ.

Обратите внимание, что это отличается от настроек, которые не вступят в силу до второго раунда настроек. Это была предыдущая проблема, которую я решил (благодаря переполнению стека), используя:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults] synchronize];
}

У меня есть методы с именем:

- (void)defaultsChanged:(NSNotification *)NSUserDefaultsDidChangeNotification

(который вызывается при отправке уведомления)

а также

-(void)setValuesFromPreferences

(который вызывается в ViewDidLoad)

Логика выглядит так в обоих:

// Set alert sounds from preferences
NSString *alertSoundPreference = [userDefaults stringForKey:kAlertSound];

BOOL alertSoundEnabled = [userDefaults boolForKey:kAlertSoundEnabled];

if (alertSoundEnabled) 
{
// Create the URLs for the alert audio files
// Store the alert sound URLs as a CFURLRef instances
// Create system sound objects representing the alert sound files
    }

У меня нет другого, потому что я предполагаю, что никакие звуковые ресурсы не будут указаны, если для alertSoundEnabled будет НЕТ.

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


person ndpmcintosh    schedule 04.09.2011    source источник


Ответы (1)


viewDidLoad не обязательно вызывается, когда приложение снова становится активным (как и viewWill/DidAppear, IIRC), поскольку весь смысл многозадачности iOS 4+ заключается в предотвращении такой загрузки/выгрузки и воссоздания объектов при переключении приложений.

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

Таким образом, я бы попытался добавить пункт else, который (после alertSoundEnabled == NO) уничтожает звуковые объекты вашей системы.

person Ben Mosher    schedule 04.09.2011
comment
Вы совершенно правы. В операторе else я уничтожаю звуковые объекты, и это помогло. Возможно, лучший способ сделать это — проверить состояние настроек в том месте, где вызывается звук, и либо воспроизвести его, либо нет, в зависимости от преф. Таким образом, вы не будете постоянно создавать и уничтожать звуковые объекты. - person ndpmcintosh; 05.09.2011
comment
Не стесняйтесь щелкать зеленую галочку, чтобы принять, если вы довольны результатом! :-) - person Ben Mosher; 06.09.2011