Переключатель настроек iOS работает с первого раза, но не снова - PullRequest
1 голос
/ 04 сентября 2011

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

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

- (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 равно NO.

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

1 Ответ

1 голос
/ 04 сентября 2011

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

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

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

...