web-dev-qa-db-ja.com

WatchKit SDKがNSUserDefaultsからデータを取得しない

Apple時計用のテストアプリを作成し、携帯電話で文字列を設定すると、Apple時計に表示されます。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"];
}

そして、私の時計インターフェイスコントローラーには、データを取得して表示するメソッドがあります。

- (IBAction)showText2 {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults synchronize];

    self.myLabel2.text = [defaults stringForKey:@"savedUserInput"];
}

何らかの理由を除いて、取得しようとしているデータがnullとして表示され、ラベルが更新されていません。

25
Ravin Sardal

+standardUserDefaultsは、現在のプロセスの情報のみを保存するNSUserDefaultsオブジェクトを返します。

IOSアプリとその拡張機能の1つとの間でデータを共有するNSUserDefaultsオブジェクトを作成する場合は、 アプリグループコンテナーを設定する を使用し、それを情報を共有するための基礎。

リンクされたドキュメントから:

アプリグループを有効にすると、アプリ拡張機能とそれを含むアプリの両方がNSUserDefaults APIを使用してユーザー設定へのアクセスを共有できます。この共有を有効にするには、initWithSuiteName:メソッドを使用して新しいNSUserDefaultsオブジェクトをインスタンス化し、共有グループの識別子を渡します。たとえば、Share拡張機能は、次のようなコードを使用して、ユーザーの最近使用した共有アカウントを更新します。

// 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"];

注:Watch OS2では、共有グループコンテナーを使用できなくなりました。

31
Dave DeLong

[〜#〜]重要[〜#〜]

Watch OS2では、共有グループコンテナーを使用できなくなりました。このスタックオーバーフロー answer を使用する必要があります。

「OS2の場合-WatchConnectivityフレームワークを使用し、WCSessionDelegateを実装する必要があります。」

8
dredful