保存和加载数据在今天扩展(iOS 8)

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

这是我的代码:

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]; } 

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

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

存储数据时不要忘记同步

 [shared synchronize]; 

你需要添加在这里详细介绍的应用程序组的东西,然后如果它真的工作(很可能在testing版下),它应该允许你像主机和小部件之间正常共享NSUserDefault数据。

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

 NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"com.you.app.container"]; 

对于任何人想知道如何在世界上保存和获取值,然后看看这个代码。

在你的常规应用程序中添加这个来保存你喜欢的* .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]; 

在您的TodayViewController.m中的viewDidLoad下面添加这个。

 NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"]; //get dic NSMutableDictionary *dictionary = [shared objectForKey:@"dicForTodayWidget"]; 

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

然后,使用

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

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

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

有关解释这一切的分步教程,请查看此博客文章 。

@edukulele今天扩展和主要应用程序运行在两个进程。 Today Extension无法接收NSUserDefaultsDidChangeNotifications。 我试过使用MMWormhole。 这很棒。