2014-06-16 1 views
5

Je dois enregistrer des données à NSUserDefault dans mon clavier iOS personnalisé. J'ai créé avec succès des groupes d'applications et des droits dans le portail des développeurs et XCode.NSUserDefault ne peut pas enregistrer et charger dans l'extension dans iOS8

Voici comment je sauve ma valeur avec UISwitch

- (IBAction)switchAction:(id)sender 
{ 
    [self.defaults setBool:self.myKey.on forKey:@"myValue"]; 

    [self.defaults synchronize]; 
} 

et voici comment je charge la valeur en KeyboardView.

self.defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.customkeyboard"]; 

if([self.defaults boolForKey:@"myValue"]) 
{ 
    self.backgroundColor = [UIColor redColor]; 
} 

else 
{ 
    self.backgroundColor = [UIColor blackColor]; 
} 

Cela ne fonctionne pas et ne charge pas la valeur.

Comment sauvegarder et charger des données?

+0

duplication possible de [Communication et persistance des données entre applications avec App Groups] (http://stackoverflow.com/questions/24015506/communicating-and-persisting-data-between-apps-with-app-groups) –

+0

Non J'ai déjà trouvé ces questions. mes questions est je ne sais pas comment charger des données de NSUserDefault. –

+0

Je faisais référence à [ma réponse à cette question] (http://stackoverflow.com/a/24063144/2446155), que j'ai légèrement modifiée et reproduite ci-dessous. –

Répondre

4

Initialiser votre objet NSUserDefaults comme celui-ci dans toutes les applications dans le groupe d'applications et ils partageront la base de données:

[[NSUserDefaults alloc] initWithSuiteName:@"group identifier"]; 

Gardez à l'esprit tout de la base de données [NSUserDefaults standardUserDefaults] pour chaque application ne se poursuivre dans cette base de données.

documentation indicates que [NSUserDefaults standardUserDefaults] doit retourner la base de données partagée comme le fait le code ci-dessus, mais ce n'est pas le cas. J'ai classé cela comme un bug (rdar: // 17164758).

Et ne pas oublier de synchroniser la base de données:

[yourDefaults synchronize]; 
+0

Oui, je fais comme vous l'avez dit et il ne se charge pas correctement. Voici mes codes. self.defaults = [[NSUserDefaults alloc] initWithSuiteName: @ ""]; Si ([self.defaults boolForKey: @ "myValue"]) } sinon { self.backgroundColor = [UIColor blackColor]; } –

+0

@Sabo La base de données commence vide, donc vous devrez appeler votre méthode 'switchAction:' avant que toutes les valeurs ne soient définies. Assurez-vous également que vos groupes d'applications sont correctement configurés dans votre fichier de droits, dans votre ID d'application de portail de développeur, dans votre profil de configuration et dans Xcode. –

+0

mon SwitchAction est un événement de connexion avec UISwitch, Lorsque UISwitch est activé, je sauvegarde la valeur dans NSUserDefault. Cependant, je ne peux pas charger ces données dans KeyboardView. :( –

0

Vous pouvez charger les données directement depuis l'application contenant, réglez alors peut-être une nouvelle valeur dans l'application d'extension aidera.

[self.defaults setObject:newValue forKey:@"thisKeyIsJustUsedForSyn"] 

Ensuite, chargez les bonnes données.

2

Ok, donc j'ai jeté un coup d'oeil parce que j'avais le problème exact. Ce que j'ai fait qui a fonctionné était d'ajouter l'application principale et l'extension à un groupe, Aller au projet principal-> Cible-> Capacités et créer un groupe (si vous n'en avez pas, ou faire un de toute façon) comme ceci:

enter image description here

Ensuite, allez à l'extension en dessous de la cible (E), de nouveau aux capacités et ajouter l'extension au groupe (exactement le même groupe d'applications que vous avez fait pour la cible principale), comme ceci:

enter image description here

Ensuite, une fois que vous avez fait à la fois, dans votre application principale, chaque fois que vous voulez ajouter quelque chose , créez une nouvelle instance de NSUserDefaults, mais pour le nom de Suit égal au nom de groupe que vous avez créé précédemment. Comme ceci:

NSArray *testing = @[@"first",@"Second",@"Third"]; 
NSUserDefaults *userd = [[NSUserDefaults alloc]initWithSuiteName:@"The gouprname I made earlier"];//This is exactly the same as the groupname 
[userd setObject:testing forKey:@"ExtensionArray"];//set the object you want to share 
[userd synchronize]; //It's a good idea to sync, just to be on the safe side. 

Dans ViewController de votre extension, utilisez le même nom de groupe, mais à lire les paramètres par défaut de l'utilisateur:

NSUserDefaults *sharedD=[[NSUserDefaults alloc]initWithSuiteName:@"Exactly the same groupname that I gave both in the Capabilities and when initialising the userdefault"]; 
self.testing = [[NSArray alloc]initWithArray:[sharedD arrayForKey:@"ExtensionArray"]]; 

Et voilà! le tableau est là! J'ai lu quelque part que vous pouvez même ajouter une fonctionnalité de notification lorsque l'objet change, en utilisant une classe Wormhole, mais je ne trouve pas le lien. Je suis sûr que si vous google pour la classe Wormhole, vous le rencontrerez.

J'espère que je pourrais aider, et si vous avez trouvé plus d'informations, s'il vous plaît le partager avec moi.

Questions connexes