Apple Watch,WatchKit和NSUserDefaults

Mar*_*man 2 xcode objective-c ios apple-watch watchkit

我想,既然"Watch App"是同一iOS应用程序中的一个包,我应该可以访问Apple Watch App中的NSUserDefaults.这不是这样吗?

我似乎无法从我的iOS获取NSUserDefaults值(我确保数据因为它在iOS应用程序中正常加载).

当我在Apple Watch应用程序中运行它时,它是空的.我是否无法访问与iOS父应用程序相同的NSUserDefaults值?

我有一个包含NSMutalArray的自定义类.这个可变数组是我想要在Watch App的Table中显示的.包含NSMutableArray的同一个类还具有向NSUserDefaults保存/加载数据的功能.它在我的iOS应用程序中工作正常但只是不加载Apple Watch应用程序中的数据.

我在这里做错了什么或者我不知道什么?

这是班级:

请记住,我也将它用作单例对象.它通过首先将自身转换为NSData将其数据保存到NSUserDefaults中 - 这就是为什么你会在这个类中看到你可以忽略的额外函数.

#import "Teacher.h"
#import "Course.h"

@implementation Teacher

static Teacher *sharedInstance = Nil;

+ (Teacher *)sharedInstance
{
    @synchronized(self)
    {
        if(!sharedInstance)
        {
            sharedInstance = [[self alloc] init];
        }
    }

    return sharedInstance;
}

- (id)init
{
    self = [super init];

    if (self)
    {
        _classes = [[NSMutableArray alloc] init];
    }

    return self;
}

- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:_classes forKey:@"classes"];
}

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super init];

    if (self)
    {
        _classes = [coder decodeObjectForKey:@"classes"];
    }

    return self;
}

+ (void)saveData
{
    NSMutableArray *teacherClasses = [[Teacher sharedInstance] classes];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:teacherClasses];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:data forKey:@"teacherClasses"];
}

+ (void)loadData
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSMutableArray *loadClasses= [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"teacherClasses"]];
    if(loadClasses == Nil)
    {
        loadClasses = [[NSMutableArray alloc] init];
    }

    [[Teacher sharedInstance] setClasses:loadClasses];
}

- (Teacher *) copyWithZone:(NSZone *)zone
{
    Teacher *teacher = [[Teacher alloc] init];
    [teacher setClasses:[self classes]];

    return teacher;
}

@end
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mat*_* S. 5

如果您希望在iOS应用程序和Apple Watch应用程序之间共享数据,则需要使用共享容器.