「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
ありがとう。