5

我需要将数据保存到NSUserDefault我的 iOS 自定义键盘中。我已在开发人员门户和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];
}

它不起作用,也不会加载价值。

如何保存和加载数据?

4

3 回答 3

4

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

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

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

文档表明 应该像上面的[NSUserDefaults standardUserDefaults]代码一样返回共享数据库,但事实并非如此。我将此作为错误提交(rdar://17164758)。

并且不要忘记同步数据库:

[yourDefaults synchronize];
于 2014-06-16T14:04:00.177 回答
2

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

在此处输入图像描述

然后,转到目标 (E) 下方的扩展,再次转到 Capabilities 并将扩展添加到组(与您为主要目标所做的完全相同的应用组),如下所示:

在此处输入图像描述

然后,一旦你完成了这两件事,在你的主应用程序中,每当你想添加一些东西时,创建一个新的 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 类在对象更改时添加通知功能,但我找不到指向它的链接。我敢肯定,如果你用谷歌搜索虫洞课程,你会遇到它。

我希望我能帮上忙,如果您发现更多信息,请与我分享。

于 2015-10-17T23:51:03.670 回答
0

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

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

然后加载正确的数据。

于 2014-06-21T12:30:48.590 回答