NSUserDefault无法保存&在iOS8中加载扩展

时间:2014-06-16 12:49:01

标签: ios nsuserdefaults ios8 ios-app-extension ios-app-group

我需要在iOS自定义键盘中将数据保存到NSUserDefault。 我已在开发人员门户网站XCode中成功创建了应用组和权利。

以下是我如何通过UISwitch保存我的价值

- (IBAction)switchAction:(id)sender
{
    [self.defaults setBool:self.myKey.on forKey:@"myValue"];

    [self.defaults synchronize];
}

以下是我在KeyboardView中加载值的方法。

self.defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.customkeyboard"];

if([self.defaults boolForKey:@"myValue"])
{
    self.backgroundColor = [UIColor redColor];
}

else
{
    self.backgroundColor = [UIColor blackColor];
}

它不起作用,也没有加载值。

如何保存和加载数据?

3 个答案:

答案 0 :(得分:4)

在应用程序组的所有应用程序中初始化NSUserDefaults这样的对象,他们将共享数据库:

[[NSUserDefaults alloc] initWithSuiteName:@"group identifier"];

请记住,每个应用程序的[NSUserDefaults standardUserDefaults]数据库中的所有内容都不会转移到此数据库中。

[NSUserDefaults standardUserDefaults] [yourDefaults synchronize]; 应该像上面的代码一样返回共享数据库,但事实并非如此。我把它作为一个错误提交(rdar:// 17164758)。

不要忘记同步数据库:

{{1}}

答案 1 :(得分:2)

好的,所以我看看周围因为我遇到了确切的问题。我所做的工作是将主应用程序和扩展程序添加到组中,转到主项目 - >目标 - >功能并创建一个组(如果您没有,或者无论如何都要创建一个组)像这样:

enter image description here

然后,转到目标(E)下面的扩展,再转到功能并将扩展添加到组(与主目标完全相同的应用组),如下所示:

enter image description here

然后,在主应用程序中完成两者后,无论何时想要添加内容,都要创建一个新的NSUserDefaults实例,但是Suitename等于您之前创建的组名。像这样:

NSArray *testing = @[@"first",@"Second",@"Third"];
NSUserDefaults *userd = [[NSUserDefaults alloc]initWithSuiteName:@"The gouprname I made earlier"];//This is exactly the same as the groupname
[userd setObject:testing forKey:@"ExtensionArray"];//set the object you want to share
[userd synchronize]; //It's a good idea to sync, just to be on the safe side.

在您的扩展程序的ViewController中,使用相同的组名,但要读取用户默认值:

NSUserDefaults *sharedD=[[NSUserDefaults alloc]initWithSuiteName:@"Exactly the same groupname that I gave both in the Capabilities and when initialising the userdefault"];
self.testing = [[NSArray alloc]initWithArray:[sharedD arrayForKey:@"ExtensionArray"]];

而且瞧!阵列在那里!我在某处读到,您甚至可以使用Wormhole类添加对象更改时的通知功能,但我无法找到它的链接。我确定如果你去谷歌虫洞课,你会遇到它。

我希望我能提供帮助,如果您发现了更多信息,请与我分享。

答案 2 :(得分:0)

您可以从包含的应用加载正确的数据,因此在扩展应用中设置新值可能会有所帮助。

[self.defaults setObject:newValue forKey:@"thisKeyIsJustUsedForSyn"]

然后加载正确的数据。