web-dev-qa-db-fra.com

WatchKit SDK ne récupère pas les données de NSUserDefaults

Je voulais créer une application de test pour la montre Apple dans laquelle vous pouvez définir une chaîne sur votre téléphone, puis elle sera affichée sur la Apple Watch J'ai décidé d'utiliser la classe NSUserDefaults pour stocker ces données.

Dans mon contrôleur de vue pour l'iPhone, j'ai une méthode qui prend l'entrée et stocke dans le stockage local:

- (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"];
}

Et dans mon contrôleur d'interface de montre, j'ai une méthode qui récupère les données et les affiche:

- (IBAction)showText2 {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults synchronize];

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

Sauf pour une raison quelconque, les données que j'essaie de récupérer sont affichées comme nulles et l'étiquette n'est pas mise à jour.

25
Ravin Sardal

+standardUserDefaults renvoie un objet NSUserDefaults qui enregistre uniquement les informations du processus en cours.

Si vous souhaitez créer un objet NSUserDefaults qui partage des données entre votre application iOS et l'une de ses extensions, vous devrez alors configurer un conteneur de groupe d'applications et l'utiliser comme base de partage des informations.

De la documentation liée:

Après avoir activé les groupes d'applications, une extension d'application et son application contenant peuvent toutes deux utiliser l'API NSUserDefaults pour partager l'accès aux préférences de l'utilisateur. Pour activer ce partage, utilisez la méthode initWithSuiteName: pour instancier un nouvel objet NSUserDefaults, en transmettant l'identifiant du groupe partagé. Par exemple, une extension de partage peut mettre à jour le compte de partage le plus récemment utilisé par l'utilisateur, à l'aide d'un code comme celui-ci:

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

REMARQUE: Avec watch OS2, vous ne pouvez plus utiliser de conteneurs de groupe partagés.

31
Dave DeLong

[~ # ~] important [~ # ~]

Avec watch OS2, vous ne pouvez plus utiliser de conteneurs de groupe partagés. Vous devez utiliser ce débordement de pile réponse .

"Pour OS2 - vous devrez utiliser les frameworks WatchConnectivity et implémenter WCSessionDelegate."

8
dredful