8

是否可以使用 NSUserDefaults 在 Today Extension 上保存和加载数据?关闭通知中心后,小部件的行为就像一个终止的应用程序,因此任何数据结果都会丢失。我该如何解决这个问题?

这是我的代码:

NSUserDefaults *defaults;

- (void)viewDidLoad {

[super viewDidLoad];

defaults = [NSUserDefaults standardUserDefaults];
NSArray *loadStrings = [defaults stringArrayForKey:@"savedStrings"];

if ([loadStrings objectAtIndex:0] != nil) {
    [display setText:[NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:0]]];
}
if ([loadStrings objectAtIndex:1] != nil) {
    calculatorMemory = [NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:1]].doubleValue;
}

}


- (IBAction)saveData:(id)sender {

NSString *displayString;
NSString *memoryString;

NSArray *saveStrings = [[NSArray alloc] initWithObjects: displayString, memoryString, nil];


defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:saveStrings forKey:@"savedStrings"];
[defaults synchronize];


}
4

5 回答 5

19

您需要使用应用程序组标识符而不是 com.* 例如:

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.appgroup"];

存储数据时不要忘记同步

[shared synchronize];
于 2014-06-07T21:08:15.900 回答
2

您需要在此处添加详细的应用程序组内容,然后如果它确实有效(在测试版下相当不确定),它应该允许您在主机和小部件之间像往常一样共享 NSUserDefault 数据。

编辑:正常 NSUserDefaults不起作用。苹果实施了一种新方法。要使用,只需像这样重新定义您的 NSUserDefaults 实例:

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"com.you.app.container"];
于 2014-06-05T22:43:53.930 回答
2

对于任何想知道您如何保存和获取值的人,请查看此代码。

在您的常规应用程序中添加它以将您喜欢的任何内容保存在 *.m 文件中。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"];

    //save dic
    [shared setObject:dictionary2 forKey:@"dicForTodayWidget"];

    //save array
    [shared setObject:tempArray2 forKey:@"arrayForTodayWidget"];

    //save some value
    [shared setObject:@"1234" forKey:@"myValForTodayWidget"];

    [shared synchronize];

在 viewDidLoad 中 TodayViewController.m 下的今天小部件中添加此内容。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"];

    //get dic
    NSMutableDictionary *dictionary = [shared objectForKey:@"dicForTodayWidget"];
于 2014-12-28T21:29:35.233 回答
1

您首先需要为两个目标(应用程序扩展程序)设置应用程序组。

然后,使用

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.myapp"];

获取可以像往常一样读取/写入的默认对象。

如果您想在默认值更改时收到通知,请NSUserDefaultsDidChangeNotification在您的小部件(或应用程序)中使用。

有关解释所有这些的分步教程,请查看此博客文章

于 2014-06-29T08:40:21.850 回答
-2

@edukulele Today Extension 和 Main 应用程序在两个进程上运行。Today Extension 无法接收 NSUserDefaultsDidChangeNotifications。我尝试使用 MMWormhole。这很棒。

于 2016-06-22T11:43:28.563 回答