ios - Apple Watch、WatchKit 和 NSUserDefaults

标签 ios objective-c xcode watchkit apple-watch

我想既然“Watch App”是同一个 iOS 应用程序中的 bundle ,我应该能够在我的 Apple Watch 应用程序中访问 NSUserDefaults。是不是这样?

我似乎无法从我的 iOS 获取 NSUserDefaults 值(我确保它有数据,因为它在 iOS 应用程序中加载良好)。

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

我有一个包含 NSMutalArray 的自定义类。这个可变数组是我想要在 Watch 应用程序的表格中显示的内容。包含 NSMutableArray 的同一类还具有将数据保存到 NSUserDefaults 或从 NSUserDefaults 加载数据的函数。它在我的 iOS 应用程序中运行良好,但只是无法在 Apple Watch 应用程序中加载数据。

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

这是类(class):

请记住,我也将它用作单例对象。它通过首先将自身转换为 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

谢谢。

最佳答案

您需要使用 shared container如果您希望在 iOS 应用程序和 Apple Watch 应用程序之间共享数据。

关于ios - Apple Watch、WatchKit 和 NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27085879/

相关文章:

ios - Swift 单元测试无法识别新的类初始值设定项

ios - 应用内购买卡在 "Missing Metadata"状态

ios - iOS iPhone 中宽度的自动布局问题

iphone - 创建动态填充 NSMutableArrays 的 NSMutableDictionary

iphone - 当我想使用outputStream创建文件时,我总是得到-1

ios - 跨多个线程的 println() 导致混合消息

ios - Libgdx IOS 不工作?

objective-c - 如何使 NSAlert 的第二个按钮成为返回按钮?

ios - 刷新配置文件时出现 XCode "Too few items in teams"错误

xcode - 使用 CocoaPods 混合 Swift3 和 Swift4 pod