2012-11-10 11 views
5

Bir Yemek Kitabı uygulaması yazıyorum ve yarattığım bir sınıfın (Recipe sınıfı) verilerini nasıl kaydedebileceğimiz hakkında hiçbir şey bulamadım.Özellik listesi nesnesi olmayan bir Objective-C nesnesini nasıl kaydedebilirim veya özellik listesinden daha iyi bir yol var mı?

-(void) writeToFile:(NSString *)file atomically:(BOOL)atomic{ 

} 

Ama var: Gördüğüm tek yolu belki bireysel olarak benim Reçete sınıf için bu yöntemi yaparak her nesne için sınıfın her elemanı kaydetmeden bir bütün olarak bu sınıfın içeriğini kaydetmek olacaktır Bu yöntemi kullanarak bu nesneyi bir dosyaya kaydetmek için bunu nasıl uygulayacağımı kesinlikle bilmiyorum. özelliklerin bazıları şunlardır:

NSString* name; 
UIImage* recipePicture; 
NSDate* dateAdded; 
NSMutableArray* ingredients; //The contents are all NSStrings. 

kimse Tarif sınıfının bir nesne kaydetme hakkında gitmek nasıl biliyor mu? Bunu anlayamama beni delirtiyor. Herhangi bir yardım büyük takdir edilecektir. Zaten "RecipeData.plist" başlıklı bir liste var. Her özelliği plist'e yazmam ve çalışma zamanında bu özelliklerle yeni bir yemek tarifi nesnesi başlatmam mı gerekiyor?

cevap

5

benimseyin:

@interface Recipe : NSObject<NSCoding> 

Uygulanışı:

- (void)encodeWithCoder:(NSCoder *)coder 
{ 
    [coder encodeObject:name_ forKey:@"name"]; 
    [coder encodeObject:recipePicture_ forKey:@"recipePicture"]; 
    [coder encodeObject:dateAdded_ forKey:@"dateAdded"]; 
    [coder encodeObject:ingredients_ forKey:@"ingredients"]; 

}

// Decode an object from an archive 
- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super init]; 
    if (self!=NULL) 
    { 
     name_ = [coder decodeObjectForKey:@"name"]; 
     recipePicture_ = [coder decodeObjectForKey:@"recipePicture"]; 
     dateAdded_ = [coder decodeObjectForKey:@"dateAdded"]; 
     ingredients_ = [coder decodeObjectForKey:@"ingredients"]; 
    } 
    return self; 
} 

Şimdi de senin kaydedin:

- (void) save:(NSString*)path recipe:(Recipe*)recipe 
{ 
    NSMutableData* data=[[NSMutableData alloc] init]; 
    if (data) 
    { 
     NSKeyedArchiver* archiver=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
     if (archiver) 
     { 
      [archiver encodeInt:1 forKey:@"Version"]; 
      [archiver encodeObject:recipe forKey:@"Recipe"]; 
      [archiver finishEncoding]; 

      [data writeToFile:path atomically:YES]; 

     } 
    } 
} 

Ve yükte:

- (Recipe*) load:(NSString*)path 
{ 
    Recipe* ret=NULL; 
    NSData* data=[NSData dataWithContentsOfFile:path]; 
    if (data) 
    { 
     NSKeyedUnarchiver* unarchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
     if (unarchiver) 
     { 
      int version=[unarchiver decodeIntForKey:@"Version"]; 
      if (version==1) 
      { 
       ret=(Recipe*)[unarchiver decodeObjectForKey:@"Recipe"]; 
      } 
      [unarchiver finishDecoding]; 
     } 
    } 
    return ret; 
} 
+0

Yanıtın diğer üçte ikisi ile bunu güncelleştirmelisiniz - bir özellik listesinde depolamak için bir NSData nesnesine nasıl kodlanacağı ve özellik listesinden verilerin nasıl çözüleceği. – rmaddy

+0

Aşağıdaki yorumda da söylediğim gibi, bunu nasıl yapacağımı göstermek için zaman ayırdığınız için çok teşekkür ederim. Gerçekten çok yardımcı oldu. – crarho

+0

'self = [super initWithCoder: coder];' yerine 'self = [super init];' demelisiniz. Aksi takdirde, süper sınıfınızın kodlanmış verileri olmayacaktır. –

2

Seçeneklerden biri (kodlama/kod çözme yanı sıra) bir sözlükte sınıfınızın her niteliğini saklamaktır. Sonra sözlüğü dosyaya yazarsın. Hile, sözlüğe koyduğunuz her nesnenin bir plisten izin verdiğinden emin olmaktır. Gösterdiğiniz dört özellikten, tüm UIImage olduğu gibi saklanabilir.

-(BOOL)writeToFile:(NSString *)file atomically:(BOOL)atomic{ 
    NSMutableDictionary *data = [NSMutableDictionary dictionary]; 

    [data setObject:name forKey:@"name"]; 
    [data setObject:dateAdded [email protected]"dataAdded"]; 

    NSDate *imageData = UIImagePNGRepresentation(recipePicture); 
    [data setObject:imageData forKey:@"recipePicture"]; 

    // add the rest 

    return [data writeToFile:file atomically:YES]; 
} 

Bunu BOOL döndürmek için güncelledik. Başarısız olursa, bunun anlamı iki şeyden birini:

  1. dosya oldu Sen

Sen önlemek için kodu eklemeniz gerekir dictonary olmayan bir plist dostu nesneyi kurtarmaya çalıştı

  • uygunsuz Varsa nil nesnesini eklemeyi denemek. Önemli olan, tüm anahtarların dizeler olmasını ve yalnızca plist uyumlu nesnelerin saklanmasını sağlamaktır (NSString, NSNumber, NSDate, NSValue, NSData, NSArray ve NSDictionary).

  • +0

    Yardımlarınız için çok teşekkür ederim. Bu büyük bir memnuniyetle karşılandı - bu problem bir süredir beni rahatsız ediyor. – crarho

    İlgili konular