2014-06-16 12 views
5

Ho bisogno di salvare i dati in NSUserDefault nella mia tastiera personalizzata iOS. Ho creato con successo gruppi di app e diritti nel portale per sviluppatori e XCode.NSUserDefault non può salvare e caricare nell'estensione in iOS8

ecco come lo salvare il mio valore con UISwitch

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

    [self.defaults synchronize]; 
} 

e ecco come lo carico valore KeyboardView.

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

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

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

Non funziona e non carica il valore.

Come posso salvare e caricare i dati?

+0

possibile duplicazione di [Comunicazione e dati persistenti tra app con gruppi di app] (http://stackoverflow.com/questions/24015506/communicating-and-persisting-data-between-apps-with-app-groups) –

+0

No Ho già trovato queste domande le mie domande è che non so come caricare i dati da NSUserDefault. –

+0

Mi riferivo a [la mia risposta a questa domanda] (http://stackoverflow.com/a/24063144/2446155), che ho leggermente modificato e replicato di seguito. –

risposta

4

inizializzare il vostro NSUserDefaults oggetto come questo in tutte le applicazioni del gruppo applicazione e saranno condividere il database:

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

Tenete a mente tutto, dalla banca dati [NSUserDefaults standardUserDefaults] per ogni applicazione non riporto in questo database.

Il documentation indicates che [NSUserDefaults standardUserDefaults] dovrebbe restituire il database condiviso come fa il codice precedente, tuttavia non lo fa. Ho archiviato questo come un bug (rdar: // 17164758).

E non dimenticare di sincronizzare il database:

[yourDefaults synchronize]; 
+0

Sì, mi piace come hai detto e non si carica correttamente. Ecco i miei codici. self.defaults = [[NSUserDefaults alloc] initWithSuiteName: @ ""]; if ([self.defaults boolForKey: @ "myValue"]) { self.backgroundColor = [UIColor redColor]; } { self.backgroundColor = [UIColor blackColor]; } –

+0

@Sabo Il database inizia vuoto, quindi dovrete chiamare il metodo 'switchAction:' prima di impostare qualsiasi valore. Assicurati inoltre che i gruppi di app siano impostati correttamente nel file dei diritti, nel tuo ID app del portale sviluppatore, nel profilo di provisioning e in Xcode. –

+0

my SwitchAction è un evento di connessione con UISwitch, quando UISwitch è attivo, salvo il valore su NSUserDefault. Tuttavia non posso caricare quei dati in KeyboardView. :( –

0

Si potrebbe caricare i dati direttamente dall'app che contiene, così forse impostare un nuovo valore in estensione applicazione vi aiuterà.

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

E quindi caricare i dati corretti.

2

Ok, quindi ho dato un'occhiata in giro perché ho avuto il problema esatto. Quello che ho fatto è stato quello di aggiungere l'app principale e l'estensione a un gruppo, Vai a progetto principale-> Destinazione-> Funzionalità e creare un gruppo (se non ne hai uno, o costruiscilo comunque) in questo modo:

enter image description here

Poi, vai alla estensione di sotto del target (e), di nuovo per funzionalità e aggiungere l'estensione al gruppo (esattamente lo stesso gruppo di app come avete fatto per il target principale), in questo modo:

enter image description here

Poi, una volta che avete fatto entrambi, nella vostra applicazione principale, ogni volta che si desidera aggiungere qualcosa , crea una nuova istanza di NSUserDefaults, ma per Nome Suit uguale al nome del gruppo che hai creato in precedenza. Come questo:

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. 

In ViewController del proprio interno, utilizzare lo stesso nome del gruppo, ma per leggere i valori di default utente:

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

e voilà! la matrice è lì! Ho letto da qualche parte che puoi persino aggiungere funzionalità di notifica per quando l'oggetto cambia, usando una classe Wormhole, ma non riesco a trovare il link ad esso. Sono sicuro che se vai su Google per la classe Wormhole, lo troverai.

Spero di poterti aiutare, e se hai trovato ulteriori informazioni, per favore condividi con me.

Problemi correlati