2014-11-07 18 views
5

questo è il mio primo post stack quindi per favore sii costruttivo quando rivedi la mia tecnica di pubblicazione!Condivisione di un array di oggetti personalizzati con Today Extension (widget) con NSUserDefaults

Fondamentalmente, il mio problema è che ho una serie di oggetti personalizzati che ho bisogno di condividere con un'estensione di oggi. Gli oggetti rappresentano le attività in un elenco di cose da fare e le loro proprietà vengono utilizzate per memorizzare informazioni su ciascuna attività (nome, posizione, scadenza, miniatura, ecc.). Gli oggetti sono memorizzati in una matrice che viene utilizzata per popolare la mia lista di cose da fare. Tutto quello che voglio fare è passare questo array al mio widget in modo da poter popolare una seconda tabella che agirà come una versione condensata del primo (per la vista widget).

Devo sottolineare che il mio widget è configurato correttamente, come ho collegato correttamente e l'app contenente insieme in "gruppi". Ho anche usato con successo NSUserDefaults per passare un array di NSStrings al widget, tuttavia, quando si tenta di passare la matrice di oggetti al widget, si blocca e il mio registro si legge:

*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Xitem)' 

Capisco che questo incidente è relativo all'archiviazione dell'oggetto (Xitem), che sembra essere un passo necessario verso il salvataggio di oggetti personalizzati in NSUserDefaults. Tuttavia, ho provato a salvare/caricare l'array all'interno della stessa classe dell'app contenente e questo funziona perfettamente! (codice di seguito)

 NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.Xitems]; 
     NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.AaronTest"]; 
     [defaults setObject:encodedObject forKey:@"myArray"]; 
     [defaults synchronize]; 


     NSUserDefaults *defaults2 = [[NSUserDefaults alloc] initWithSuiteName:@"group.AaronTest"]; 
     NSData *encodedObject2 = [defaults2 objectForKey:@"myArray"]; 
     NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject2]; 

     for (Xitem *t in array2){ 

      NSLog(@"*****%@*****", t.itemName); 
     } 

Va bene così come spiegato, il codice sopra riportato funziona come previsto. Tuttavia, quando inserisco la seconda metà 'unarchiver' di questo codice nel mio widget di oggi, ottengo l'errore di cui sopra. Qui di seguito è il mio codice di mostrare come ho codificare/decodificare l'oggetto (può valere la pena notare che questo oggetto è stato creato per la semplicità del mio debug e contiene solo una proprietà NSString):

Xitem.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 


@interface Xitem : NSObject <NSCoding> 
{ 
NSString *itemName; 
} 

-(void)encodeWithCoder:(NSCoder*)encoder; 
-(id)initWithCoder:(NSCoder*)decoder; 

@property NSString *itemName; 

@end 

Xitem.m

#import "Xitem.h" 

@implementation Xitem 

@synthesize itemName; 

-(void)encodeWithCoder:(NSCoder*)encoder 
{ 

[encoder encodeObject:self.itemName forKey:@"iName"]; 

} 

-(id)initWithCoder:(NSCoder*)decoder 
{ 

self = [super init]; 

self.itemName = [decoder decodeObjectForKey:@"iName"]; 

return self; 
} 

@end 

ho potuto anche pubblicare il mio widget e contenente il codice app, ma non differire dalla prima serie di codice che ho postato (a parte le variabili rinominato come 'defaults2'). Devo sottolineare che ho davvero esaurito le risorse mentre cercavo di risolvere questo problema, ma il fatto che l'utilizzo di NSKeyedArchiver esclusivamente nell'app che contiene funzioni, mi ha lasciato perplesso.

Mi rendo conto che il this post è molto simile al mio problema, ma l'autore decide di optare per una soluzione alternativa, mentre mi piacerebbe davvero sapere perché questo non funziona. Sono un nuovo sviluppatore e sto facendo del mio meglio per riprendere le migliori pratiche di lavoro, quindi ogni consiglio sarebbe molto apprezzato.

Penso che sia anche possibile sostituire il mio oggetto (classe) con un NSDictionary? Tuttavia vorrei evitare questo, se possibile, perché causerebbe molti conflitti nell'app principale, ma ovviamente se questo è il metodo corretto affronterò questo problema. Nota a margine, se un dizionario sarebbe meglio di un oggetto per i miei requisiti (elenco delle cose da fare con proprietà di UIImage, CLLocation, ecc.) Per qualsiasi altra ragione (memoria o accessibilità per esempio), per favore, elabora e aiutami a capire perché!

Molte grazie per anyones volta :)

+0

Qualcuno ha qualche input per me?Ho lasciato questo problema da una parte perché sembra che dovrebbe funzionare in questo modo, se qualcuno sa perché non è il caso di indicarmelo. Ci scusiamo per l'urto ma è stato più di una settimana. – Swankzilla

risposta

3

Va bene così ho appena risolto questo. Se qualcuno ha lo stesso problema, vai a: "Obiettivi"> "Widget"> "Fasi di compilazione"> "Compila origini"> aggiungi lì la classe personalizzata (Xitem.m)

+0

hanno anche lo stesso problema, ma questa correzione non dovrebbe funzionare per me ... – kurtanamo

+0

Ricorda che questo finirà per aggiungere duplicazioni non necessarie al tuo pacchetto di app; stai effettivamente creando due file oggetto separati che vengono collegati in linea alla tua app e alla tua estensione per app. Non è un grosso problema per le app più piccole, ma ripetere questo schema può far crescere il tuo binario più del necessario. In definitiva, penso che uno schema migliore a lungo termine sarebbe quello di fare qualcosa come estrapolare il codice (comune tra App e App-Extension) in un Framework, quindi collegare sia l'App ** che ** l'estensione dell'app a Struttura. – fullofsquirrels