我正在使用iPad设置应用程序更改一些按钮声音和背景图像。一切运行良好,设置从模拟器中的一个应用程序启动到另一个应用程序启动。现在我已经实现了一个切换开关来关闭或打开声音设置。当应用程序启动时,无论交换机处于什么状态,它都能正常工作;例如如果“警报声音”开关关闭,则警报声音静音,如果我将其更改为开启,则声音将开始工作。但是,如果我将开关关闭,声音仍然可以继续工作。但是,如果应用程序启动时状态为ON,则声音有效,但当开关设置为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,则不会指定声音资源。
我已经搜索过提及这个问题的解释和教程,但还没有找到,所以我在这里问。感谢您的任何建议。
答案 0 :(得分:1)
viewDidLoad
(viewWill/DidAppear
,IIRC也不会),因为iOS 4+多任务处理的重点是防止此类加载/卸载和重新创建对象在应用程序切换。
如果我不得不猜测,当用户在原始启动/ viewDidLoad
开启时,声音已经分配;但是,如果你的代码在加载时没有明确地取消关联它们,那么它们会继续播放,因为它们都已经设置好了。
因此,我会尝试添加一个else
子句(在alertSoundEnabled == NO
之后)破坏你的系统声音对象。