Превключвателят за настройки на 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
    }

Нямам else, защото предполагам, че няма да бъдат посочени звукови ресурси, ако alertSoundEnabled е NO.

Търсих обяснения и уроци, които споменават този проблем, но все още не съм намерил, затова питам тук. Благодаря за всякакви предложения.


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