我遇到了以下问题:
我创建了一个今日扩展,其中包含UISwitch
。今天扩展中此开关的IBAction应使用NSUserDefaults
和initWithSuite存储on-state,如下所示:
- (IBAction)switchStateChanged:(id)sender {
BOOL isOn = self.preferenceSwitch.isOn;
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.x.TodayExtensionSharingDefaults"];
[sharedDefaults setBool: isOn forKey: @"SwitchState"];
[sharedDefaults synchronize];
}
现在在我的Containing App中,我知道我可以使用它来访问开关状态:
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.x.TodayExtensionSharingDefaults"];
BOOL value = [defaults boolForKey:@"SwitchState"];
我正在寻找一个解决方案,当我更改交换机的值时,我会在主内容应用中为我提供回调。
在此解决方案中,我必须设置NSTimer
,例如每200ms刷新一次用户默认值。
通过向sharedDefaults添加Observer是否有任何解决方案?
答案 0 :(得分:0)
我认为这适用于您的用例:
当您离开应用并打开通知中心时,
- (void)applicationWillResignActive:(UIApplication *)application
在AppDelegate中调用。当你从小部件回来时,
- (void)applicationDidBecomeActive:(UIApplication *)application
在AppDelegate中调用。因此,只需检查您的值,然后向您的控制器发出内部通知。你不应该需要一个计时器。
答案 1 :(得分:0)
观察应用程序中的更改并不是一个好的解决方案,即使您可以使其正常工作,因为当切换值发生变化时,您无法确定应用程序是否正在运行。这也不是今天扩展的目的。
如果你的应用程序需要在下次运行时知道此开关的状态(识别出在点击开关时它可能没有运行),那么你已经做了正确的事情。
如果您需要立即通知您的应用程序交换机值已更改(再次,识别您的应用程序可能未运行并且这样做可能会启动您的应用程序),您应该为您的应用程序创建自定义URL方案,然后从扩展程序中打开URL。这将是:
[NSExtensionContext openURL:completionHandler:]
打开网址。这将启动您的应用并传递提供的网址。如果网址方案类似mygreatapp
,则应用扩展程序会打开mygreatapp:
之类的网址。如果需要,您可以向URL添加详细信息,或者应用只能使用用户默认值来查找保存的值。