WatchKit SDK不从NSUserDefaults中检索数据

我想为苹果手表制作一个testing应用程序,您可以在手机上设置一些string,然后显示在Apple Watch上。 我决定使用NSUserDefaults类来存储这些数据。

在我的视图控制器为iPhone我有一个方法,把input和存储到本地存储:

- (IBAction)saveInfo:(id)sender { NSString *userInput = [myTextField text]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:userInput forKey:@"savedUserInput"]; [defaults synchronize]; self.myLabel.text = [defaults stringForKey:@"savedUserInput"]; } 

在我的手表界面控制器中,我有一个方法来检索数据并显示它:

 - (IBAction)showText2 { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults synchronize]; self.myLabel2.text = [defaults stringForKey:@"savedUserInput"]; } 

除了某些原因,我试图检索的数据显示为空,并且标签没有被更新。

+standardUserDefaults返回一个只保存当前进程信息的NSUserDefaults对象。

如果你想创build一个NSUserDefaults对象来共享你的iOS应用程序和它的一个扩展之间的数据,那么你需要设置一个应用程序组容器,并以此作为共享信息的基础。

从链接的文档:

启用应用程序组后,应用程序扩展程序及其包含的应用程序都可以使用NSUserDefaults API来共享对用户首选项的访问。 要启用这种共享,请使用initWithSuiteName:方法来实例化一个新的NSUserDefaults对象,并传入共享组的标识符。 例如,共享扩展程序可能会使用如下代码更新用户最近使用的共享帐户:

 // Create and share access to an NSUserDefaults object. NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.example.domain.MyShareExtension"]; // Use the shared user defaults object to update the user's account. [mySharedDefaults setObject:theAccountName forKey:@"lastAccountName"]; 

注:使用手表OS2,您不能再使用共享组容器。

重要

使用手表OS2,您不能再使用共享组容器。 你需要使用这个堆栈溢出的答案 。

“对于OS2,您将需要使用WatchConnectivity框架并实施WCSessionDelegate。”