2014-11-07 27 views
5

ile Bugün Uzantısı (widget) ile bir dizi özel nesnenin paylaşılması bu benim ilk yığın gönderiimdir, bu yüzden gönderme tekniğimi incelerken lütfen yapıcı olun!NSUserDefaults

Temelde, benim sorunum, bugün bir uzantı ile paylaşmam gereken bir dizi özel nesneye sahip olduğum. Nesneler, yapılacaklar listesindeki görevleri temsil eder ve özellikleri, her görevle ilgili bilgileri (ad, konum, dueDate, küçük resim vb.) Depolamak için kullanılır. Nesneler, yapılacaklar listemi doldurmak için kullanılan bir dizide saklanır. Tek yapmak istediğim, bu diziyi benim widget'ımın içine geçirmektir, böylece birincinin (versiyon görünümü için) yoğunlaştırılmış bir versiyonu olarak hareket edecek ikinci bir tablo görünümünü doldurabilirim.

Düzgün bir şekilde bağladığım ve içerdiği uygulamayı 'gruplar' bölümünde olduğu gibi, widget'ımın düzgün şekilde ayarlandığını işaret etmeliyim. Ben de başarıyla ben Widget'a nesnelerin dizisi geçirmek çalıştığınızda, ancak, Widget'a NSStrings dizisi geçmesine NSUserDefaults kullanmış, çöker ve benim günlüğü okur:

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

Bu çarpışma anlıyoruz NSUserDefaults'daki özel nesneleri kaydetmeye yönelik gerekli bir adım gibi görünen nesneyi (Xitem) arşivlemekle ilgilidir. Ancak, diziyi içeren uygulamanın aynı sınıfında kaydetmeyi/yüklemeyi test ettim ve bu iyi çalışıyor! (Aşağıdaki kodu) açıklandığı gibi beklendiği gibi, yukarıdaki kod çalışır böylece

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

tamam. Ancak, bu kodun ikinci 'unarchiver' yarısını bugün widget'ım içine eklediğimde, yukarıda belirtilen hatayı alıyorum.

#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.h: Aşağıda benim kodu (bu nesne benim hata ayıklama basitlik için oluşturulduğunu belirterek değecek ve sadece NSString özelliği içeren olabilir) nesneyi deşifre/I kodlamak nasıl göstermektir

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 

Ben de widget ve içeren uygulama kodunu sonrası olabilir, ancak ben (dışında böyle 'defaults2' olarak değiştirildi değişkenlerden) yayınlanmıştır kodunun ilk kümesinden farklı değildir. Bu sorunu çözmeye çalışırken gerçekten çok fazla kaynak tükettiğime işaret etmeliyim, ancak NSKeyedArchiver'in sadece içeren uygulamalarda kullanılmasının beni güldürdü.

Ben this post kendi sorununa çok benzer olduğunu biliyoruz, ama aslında bu işe yaramazsa neden bilmek istiyorum oysa yazar, geçici bir çözüm tercih etmeye karar verir. Yeni bir geliştiriciyim ve en iyi çalışma pratikleri için elimden gelenin en iyisini yapıyorum.

Nesnemin (sınıf) bir NSDictionary ile değiştirilmesi de mümkün mü? Ancak eğer mümkünse bunu önlemek isterim çünkü ana uygulamada birçok çakışmalara neden olur, ama açıkçası bu problemle başa çıkacağım doğru yöntem buysa. Bir yan notta, bir sözlük benim başka bir nedenden dolayı (örneğin bellek veya erişilebilirlik) gereksinimlerim için bir nesneden daha iyi olacaksa (örneğin, bellek veya erişilebilirlik gibi) lütfen detaylandırın ve anlamama yardımcı olun. niye ya! :)

+0

Kimsenin benim için bir girişi var mı?Bu sorunu bir tarafa bıraktım çünkü bu şekilde çalışması gerekiyor gibi görünüyor, eğer kimse bunun neden bana işaret ettiğini bilmiyorsa. Yumru için üzgünüm ama bir haftadan fazla oldu. – Swankzilla

cevap

3

Tamam herkesin kez

çok teşekkürler yüzden sadece bu sabit. Herkesin aynı soruna sahip olması durumunda şu adrese gidin: 'Hedefler>>' Widget '>' Yapı Aşamaları>> 'Kaynak Derleme'> özel sınıf ekle (Xitem.m)

+0

da aynı soruna sahip, ancak bu düzeltme benim için işe yaramaz ... – kurtanamo

+0

Bunun uygulama paketinize gereksiz çoğaltma eklenmesiyle sonuçlanacağını unutmayın; Uygulamanıza ve uygulama uzantılarınıza satır içi bağlanan iki ayrı nesne dosyası oluşturuyorsunuz. Küçük uygulamalar için büyük bir anlaşma değil, ancak bu kalıbı tekrarlamak, ikili dosyanızı gereğinden fazla büyütebilir. Sonuç olarak, uzun vadede daha iyi bir model, (Uygulama-ve-Uygulama-Yaygın-Uygulama) kodunuzu bir Çerçeve içine çıkarmak, ardından hem App ** hem de ** Uygulama Eklentisini birbirine bağlamak gibi bir şey yapmak olduğunu düşünüyorum. Çerçeve. – fullofsquirrels