iOS设置切换开关第一次运行但不会再次运行

时间:2011-09-04 18:46:05

标签: objective-c ios ipad appsettings

我正在使用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,则不会指定声音资源。

我已经搜索过提及这个问题的解释和教程,但还没有找到,所以我在这里问。感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

当应用程序再次变为活动状态时,不一定会调用{p> viewDidLoadviewWill/DidAppear,IIRC也不会),因为iOS 4+多任务处理的重点是防止此类加载/卸载和重新创建对象在应用程序切换。

如果我不得不猜测,当用户在原始启动/ viewDidLoad开启时,声音已经分配;但是,如果你的代码在加载时没有明确地取消关联它们,那么它们会继续播放,因为它们都已经设置好了。

因此,我会尝试添加一个else子句(在alertSoundEnabled == NO之后)破坏你的系统声音对象。