2014-11-07 11 views
5

Dies ist meine erste Stack-Post also bitte konstruktiv sein, wenn Sie meine Posting-Technik überprüfen!Teilen eines Arrays von benutzerdefinierten Objekten mit Today Extension (Widget) mit NSUserDefaults

Grundsätzlich ist mein Problem, dass ich ein Array von benutzerdefinierten Objekten habe, die ich mit einer heutigen Erweiterung teilen muss. Die Objekte stellen Aufgaben in einer To-Do-Liste dar, und ihre Eigenschaften werden verwendet, um Informationen über jede Aufgabe (Name, Ort, Fälligkeitsdatum, Miniaturbild usw.) zu speichern. Die Objekte werden in einem Array gespeichert, das zum Füllen meiner To-Do-Liste verwendet wird. Alles, was ich tun möchte, ist, dieses Array an mein Widget zu übergeben, damit ich eine zweite Tabellenansicht füllen kann, die als eine verkürzte Version der ersten (für die Widget-Ansicht) fungiert.

Ich sollte darauf hinweisen, dass mein Widget richtig eingerichtet ist, wie in ich habe es richtig verbunden und die enthaltende App zusammen in 'Gruppen'. Ich habe auch eine Reihe von NSStrings auf das Widget passieren, aber erfolgreich NSUserDefaults verwendet, wenn ich versuche, das Array von Objekten an das Widget zu passieren, es stürzt ab und mein Log liest:

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

Ich verstehe, dass dieser Absturz bezieht sich auf die Archivierung des Objekts (Xitem), was ein notwendiger Schritt zum Speichern benutzerdefinierter Objekte in NSUserDefaults zu sein scheint. Allerdings habe ich das Speichern/Laden des Arrays innerhalb der gleichen Klasse der enthaltenen App getestet, und das funktioniert gut! (Code unten)

 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); 
     } 

Okay, wie oben beschrieben funktioniert der obige Code wie erwartet. Wenn ich jedoch die zweite Hälfte dieses Codes in mein heutiges Widget einfüge, bekomme ich den oben genannten Fehler. Unten ist mein Code zu zeigen, wie ich kodieren/dekodieren das Objekt (es kann sich lohnen, unter Hinweis darauf, dass diese Aufgabe für die Einfachheit meiner Debuggen erstellt und enthält nur eine NSString Eigenschaft):

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 

kann ich auch meinen Widget und enthalten App-Code schreiben, aber es aus dem ersten Satz von Code i (abgesehen von den umbenannten Variablen wie ‚defaults2‘) unterscheidet posted nicht. Ich sollte darauf hinweisen, dass ich wirklich Ressourcen erschöpft habe, während ich versuche, dieses Problem zu lösen, aber die Tatsache, dass die Verwendung von NSKeyedArchiver ausschließlich in der enthaltenen App funktioniert, hat mich ratlos gemacht.

Ich realisiere, dass this post ist sehr ähnlich zu meinem eigenen Problem, aber der Autor entscheidet sich für eine Abhilfe, während ich eigentlich gerne wissen möchte, warum das nicht funktioniert. Ich bin ein neuer Entwickler und tue mein Bestes, um die besten Arbeitspraktiken aufzuzeigen, so dass jeder Rat sehr geschätzt wird.

Ich denke, es ist auch möglich, mein Objekt (Klasse) durch ein NSDictionary zu ersetzen? Ich möchte dies jedoch möglichst vermeiden, da es viele Konflikte in der Haupt-App geben würde, aber wenn das die richtige Methode ist, werde ich natürlich dieses Problem angehen. Nebenbei, wenn ein Wörterbuch besser wäre als ein Objekt für meine Anforderungen (Aufgabenliste mit Eigenschaften von UIImage, CLLocation, etc.) aus anderen Gründen (Speicher oder Zugänglichkeit zum Beispiel) bitte machen Sie es aus und helfen Sie mir zu verstehen Warum!

Vielen Dank für anyones Zeit :)

+0

Hat jemand irgendeine Eingabe für mich?Ich habe dieses Problem beiseite gelegt, weil es scheint, dass es so funktionieren sollte, wenn irgendjemand weiß, warum es mich nicht darauf hinweist. Sorry für die Beule, aber es war über eine Woche. – Swankzilla

Antwort

3

Okay, so ich dies nur fixiert. Falls jemand das selbe Problem hat, gehen Sie zu: 'Ziele'> 'Widget'> 'Build-Phasen'> 'Quellen kompilieren'> eigene Klasse hinzufügen (Xitem.m)

+0

haben auch das gleiche Problem, aber dieses Update sollte nicht für mich arbeiten ... – kurtanamo

+0

Seien Sie sich bewusst, dass dies am Ende unnötige Duplizierung zu Ihrem App-Bundle hinzufügen wird; Sie erstellen effektiv zwei separate Objektdateien, die inline mit Ihrer App und Ihrer App-Erweiterung verknüpft werden. Keine große Sache für kleinere Apps, aber das Wiederholen dieses Patterns kann deine Binärdatei mehr als nötig wachsen lassen. Letztendlich denke ich, dass ein langfristiges besseres Muster darin bestehen würde, den Code (common-between-App-and-App-Extension) in ein Framework zu extrahieren und dann sowohl Ihre App ** als auch meine App Extension damit zu verknüpfen Rahmen. – fullofsquirrels