25

我想为 Apple Watch 做一个测试应用,你可以在手机上设置一些字符串,然后它会显示在 Apple Watch 上。我决定使用 NSUserDefaults 类来存储这些数据。

在我的 iPhone 视图控制器中,我有一个方法可以将输入存储到本地存储中:

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

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

4

2 回答 2

31

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

如果您想创建一个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"];

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

于 2014-11-19T01:24:12.783 回答
8

重要的

使用 watch OS2,您不能再使用共享组容器。您需要使用此堆栈溢出答案

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

于 2016-04-06T15:34:47.153 回答