WatchKit SDK无法从NSUserDefaults检索数据

Rav*_*dal 25 xcode objective-c ios xcode6 watchkit

我想为Apple手表制作一个测试应用程序,您可以在手机上设置一些String,然后它将显示在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"];
}
Run Code Online (Sandbox Code Playgroud)

在我的监视接口控制器中,我有一个检索数据并显示它的方法:

- (IBAction)showText2 {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults synchronize];

    self.myLabel2.text = [defaults stringForKey:@"savedUserInput"];
}
Run Code Online (Sandbox Code Playgroud)

除了某些原因,我试图检索的数据显示为null,标签没有更新.

Dav*_*ong 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"];
Run Code Online (Sandbox Code Playgroud)

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

  • @DaveDeLong完全正确.谢谢!虽然在docs中苹果说:NSUserDefaults*mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyShareExtension"]; 但是groupId只能从"组"开始.字首.所以正确的代码是:NSUserDefaults*mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.myGroupId"]; (2认同)

dre*_*ful 8

重要

使用手表OS2,您无法再使用共享组容器.您需要使用此堆栈溢出答案.

"对于OS2--您将需要使用WatchConnectivity框架并实现WCSessionDelegate."