Я делаю приложение Cookbook для iPad и iPod, и у меня есть массив моего класса Recipe в моем классе Cookbook.
@interface Cookbook : NSObject<NSCoding>{
NSMutableArray* recipes;
}
Это в моем классе Cookbook, и в моем классе рецептов у меня есть это:
@interface Recipe : NSObject<NSCoding>{
NSString* name;
NSMutableArray* ingredients; //List of ingredients for the recipe
UIImage* recipePicture;
NSMutableArray* instructions;
unsigned int prepTime;//in seconds
NSDate* dateAdded;
}
(На самом деле у меня здесь больше переменных, но я не хотел заливать их чрезмерным количеством)
Моя проблема в основном в функции сохранения/загрузки. Я уже задавал аналогичный вопрос здесь: Как я могу сохранить объект Objective-C, который не является объектом списка свойств, или есть ли лучший способ для этого, чем список свойств?
Это заставило меня решить, что лучше всего использовать NSCoding, и я уже реализовал метод и для него в соответствии с тем, как было предложено с NSCoding.
Моя основная проблема заключается в том, что я не могу сохранить и успешно получить рецепты.
У меня также были проблемы с получением каталога в моем файле RecipeList.plist для хранения рецептов.
Любая помощь будет принята с благодарностью, так как это было причиной, по которой я не могу продолжать делать это приложение.
В моем Cookbook.m у меня есть:
-(id) initWithCoder:(NSCoder *)aDecoder{
NSLog(@"Init With Coder - Cookbook");
if(self = [super init]){
recipes = [aDecoder decodeObjectForKey:@"recipes"];
}
return self;
}
В моем Recipe.m:
-(id) initWithCoder:(NSCoder *)aDecoder{
if(self = [super init]){
name = [aDecoder decodeObjectForKey:@"name"];
ingredients = [aDecoder decodeObjectForKey:@"ingreds"];
recipePicture = [aDecoder decodeObjectForKey:@"recipePict"];
}
return self;
}
Еще раз, у меня есть больше переменных, это просто для простоты. Кроме того, это моя попытка получить путь к файлу RecipeList.plist:
+(NSString*) filePath{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"RecipeList.plist"];
NSLog(@"%@",path);
return path;
}
Моя попытка сохранить метод в моем AppDelegate.m:
-(void) save:(NSString *)path cookbook:(Cookbook *)cookbook{
BOOL b = [[NSFileManager defaultManager] fileExistsAtPath:path];
NSLog(@"File exists: %i",b); //1 = exists, 0 = doesn't
NSMutableData* data = [[NSMutableData alloc] init];
if(data){ //If the data object was successfully initialized
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
if(archiver){
//Encode the recipe using the coder method defined in recipe.
[archiver encodeInt:1 forKey:@"Version"];
[archiver encodeObject:cookbook forKey:@"Cookbook"];
[archiver finishEncoding];
[data writeToFile:path atomically:YES];
}
}
}
и мой метод загрузки:
-(Cookbook *) loadCookbook:(NSString *)path{
BOOL b = [[NSFileManager defaultManager] fileExistsAtPath:path];
NSLog(@"File exists: %i",b);
Cookbook* ret = nil;
NSData* data = [NSData dataWithContentsOfFile:path];
if(data){
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
int version = [unarchiver decodeIntForKey:@"Version"];
if(version == 1){
ret = (Cookbook*) [unarchiver decodeObjectForKey:@"Cookbook"];
}
[unarchiver finishDecoding];
}
return ret;
}
У меня также есть метод сохранения и загрузки для моего класса Recipe, очень похожий на этот.
Еще раз, любая помощь будет принята с благодарностью, и спасибо, что нашли время, чтобы прочитать это.
РЕДАКТИРОВАТЬ: Вот метод encodeWithCoder в Recipe.m с несколькими переменными, опущенными для краткости:
-(void) encodeWithCoder:(NSCoder *)aCoder{
NSLog(@"Encoding Recipe.");
[aCoder encodeObject:name forKey:@"name"];
[aCoder encodeObject:ingredients forKey:@"ingreds"];
[aCoder encodeObject:recipePicture forKey:@"recipePict"];
[aCoder encodeObject:instructions forKey:@"instructs"];
[aCoder encodeObject:category forKey:@"categ"];
[aCoder encodeObject:dateAdded forKey:@"dateAdd"];
[aCoder encodeInt:prepTime forKey:@"prepTime"];
}
и в Cookbook.m:
-(void) encodeWithCoder:(NSCoder *)aCoder{
NSLog(@"Encoding cookbook.");
[aCoder encodeObject:recipes forKey:@"recipes"];
}
encodeWithCoder:
реализациях? - person fguchelaar   schedule 20.12.2012