2

「Watch App」は同じ iOS アプリケーションのバンドルであるため、Apple Watch App 内で NSUserDefaults にアクセスできるはずです。そうではありませんか?

iOS から NSUserDefaults 値を取得できないようです (iOS アプリで正常に読み込まれるため、データがあることを確認しました)。

Apple Watch アプリで実行すると、空になります。iOS 親アプリと同じ NSUserDefaults 値にアクセスできないのですか?

NSMutalArray を含むカスタム クラスがあります。この変更可能な配列は、Watch アプリのテーブルに表示したいものです。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

ありがとう。

4

1 に答える 1

5

iOS アプリと Apple Watch アプリの間でデータを共有する場合は、共有コンテナーを使用する必要があります。

于 2014-11-23T05:31:19.503 に答える