2014-11-07 7 views
5

to jest mój pierwszy wpis dotyczący stosu, więc prosimy o konstruktywne podejście do mojej techniki księgowania!Udostępnianie tablicy obiektów niestandardowych z rozszerzeniem Dzisiaj (widget) przy użyciu NSUserDefaults

Zasadniczo, moim problemem jest to, że mam szereg niestandardowych obiektów, które muszę udostępnić z rozszerzeniem dzisiaj. Obiekty reprezentują zadania na liście spraw do załatwienia, a ich właściwości służą do przechowywania informacji o każdym zadaniu (imię i nazwisko, lokalizacja, data_wydarzenia, miniatura itp.). Obiekty są przechowywane w tablicy, która służy do zapełniania mojej listy zadań do wykonania. Wszystko, co chcę zrobić, to przekazać tę tablicę do mojego widżetu, dzięki czemu mogę zapełnić drugi widok tabeli, który będzie działać jako skondensowana wersja pierwszego (dla widoku widżetów).

Powinienem wskazać, że mój widget jest poprawnie skonfigurowany, ponieważ prawidłowo go powiązałem, a aplikację zawierającą razem w "grupach". Mam również z powodzeniem stosowany NSUserDefaults przekazać tablicę NSStrings do widgetu, jednak gdy próbuję przekazać tablicę obiektów do widgetu, ulega awarii i mój dziennik czyta:

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

Rozumiem, że ta katastrofa jest związane z archiwizacją obiektu (Xitem), co wydaje się być koniecznym krokiem w kierunku zapisywania niestandardowych obiektów w NSUserDefaults. Jednak przetestowałem zapisywanie/ładowanie tablicy w obrębie tej samej klasy aplikacji zawierającej i działa to dobrze! (kod poniżej)

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

OK, zgodnie z wyjaśnieniem, powyższy kod działa zgodnie z oczekiwaniami. Jednak kiedy wstawię drugą "unarchiver" połowę tego kodu do mojego dzisiejszego widgetu, otrzymam wyżej wymieniony błąd. Poniżej jest mój kod, aby pokazać w jaki sposób kodowania/dekodowania obiektu (może to być zauważyć, że cel ten został stworzony dla prostoty mojego debugowania i tylko zawiera właściwość 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 

mogę również zamieścić moje widget i zawierającą kod aplikacji, ale nie różni się od pierwszego zestawu kodu Zamieściłem (poza zmienionymi nazwami zmiennych, takich jak „defaults2”). Powinienem wskazać, że naprawdę mam wyczerpane zasoby, próbując rozwiązać ten problem, ale fakt, że używanie NSKeyedArchiver działa wyłącznie w aplikacji zawierającej, sprawił, że byłem zaskoczony.

Zdaję sobie sprawę, że this post jest bardzo podobny do mojego własnego problemu, ale autor decyduje się na obejście tego problemu, podczas gdy ja naprawdę chciałbym wiedzieć, dlaczego to nie działa. Jestem nowym programistą i robię, co w mojej mocy, aby zebrać najlepsze praktyki pracy, więc wszelkie rady będą mile widziane.

Myślę, że jest również możliwe zastąpienie mojego obiektu (klasy) NSDictionary? Jednak chciałbym tego uniknąć, jeśli to możliwe, ponieważ spowodowałoby to wiele konfliktów w głównej aplikacji, ale oczywiście jeśli to jest właściwa metoda, rozwiążę ten problem. Na marginesie, jeśli słownik byłby lepszy niż obiekt dla moich wymagań (lista rzeczy do zrobienia z właściwościami UIImage, CLLocation, itp.) Z jakichkolwiek innych powodów (pamięć lub dostępność na przykład), proszę opracuj i pomóż mi zrozumieć czemu!

Dziękujemy za czyjegoś czasu :)

+0

Czy ktoś ma jakieś dane wejściowe dla mnie?Zostawiłem ten problem z jednej strony, ponieważ wydaje się, że powinien działać w ten sposób, jeśli ktoś wie, dlaczego tak nie jest, proszę mi go wskazać. Przepraszamy za uderzenie, ale minęło ponad tydzień. – Swankzilla

Odpowiedz

3

Dobrze więc po prostu to ustalone. Jeśli ktoś ma ten sam problem, przejdź do: 'Targets'> 'Widget'> 'Build Phases'> 'Compile Sources'> dodaj niestandardową klasę tam (Xitem.m)

+0

mają również ten sam problem, ale ta poprawka nie powinna działać dla mnie ... – kurtanamo

+0

Pamiętaj, że to skończy się dodając niepotrzebne duplikowanie do pakietu aplikacji; skutecznie budujesz dwa oddzielne pliki obiektów, które są połączone bezpośrednio z Twoją aplikacją i rozszerzeniem aplikacji. Nie jest to wielka oferta dla mniejszych aplikacji, ale powtarzanie tego wzorca może zwiększyć twój plik binarny bardziej niż to konieczne. Ostatecznie uważam, że lepszym rozwiązaniem na dłuższą metę byłoby zrobienie czegoś takiego, jak wyodrębnienie kodu (wspólnego między aplikacjami i aplikacjami) w strukturze, a następnie połączenie zarówno aplikacji **, jak i rozszerzenia aplikacji **. Struktura. – fullofsquirrels

Powiązane problemy