Добавление элементов в NSMutableArray и сохранение / загрузка - PullRequest
2 голосов
/ 19 марта 2011

Я использовал это руководство, чтобы создать приложение с табличным представлением, которое заполняется с помощью NSMutableArray. Теперь я хотел бы добавить функциональность, чтобы добавить дополнительные элементы в массив и сохранить / загрузить их. Я настроил класс Fruit так, чтобы он выглядел так:

#import <UIKit/UIKit.h>

@interface Fruit : NSObject {
NSString *name;
NSString *instructions;
NSString *explination;
NSString *imagePath;
}

@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *instructions;
@property(nonatomic,copy) NSString *explination;
@property(nonatomic,copy) NSString *imagePath;

- (id)initWithName:(NSString*)n instructions:(NSString *)inst explination:(NSString *)why imagePath:(NSString *)img;

@end

и файл Fruit.m:

#import "Fruit.h"

@implementation Fruit
@synthesize name,instructions,explination,imagePath;

- (id)initWithName: (NSString*)n instructions:(NSString*)inst explination:(NSString *)why imagePath:(NSString *)img {
    self.name = n;
    self.instructions = inst;
    self.explination = why;
    self.imagePath = img;
    return self;
}
@end

и это прекрасно работает, я могу загрузить два textview и imageView вместо одного textview. Но как мне сохранить новые элементы, созданные пользователем, и загрузить их (если они существуют) при повторном запуске приложения?

Ответы [ 3 ]

8 голосов
/ 19 марта 2011

для сохранения вашего массива на диск вам понадобится пара вещей.

сначала вам нужно добавить несколько методов к вашему классу фруктов, чтобы он соответствовал протоколу NSCoding .

Первый метод - - (id)initWithCoder:(NSCoder *)aDecoder.Этот метод вызывается при создании объекта Fruit из сохраненного архива.
Второй метод - - (void)encodeWithCoder:(NSCoder *)aCoder.Этот метод используется для сохранения ваших фруктов в архиве.

Звучит сложно?На самом деле это не так.Всего пара строк понятного кода.

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.instructions = [aDecoder decodeObjectForKey:@"instructions"];
        self.explanation = [aDecoder decodeObjectForKey:@"explanation"];
        self.imagePath = [aDecoder decodeObjectForKey:@"imagePath"];
    }
    return self;
}

Посмотрите на первые две строки этого метода init.Вы должны позвонить [super init] и проверить, не равен ли self ноль и в вашем методе initWithName:instructions:explination:imagePath:.В этом особом случае это ничего не изменит, но определенно изменится в следующих нескольких написанных вами классах.Так что используйте это все время.
Я изменил это для вас.И я изменил орфографическую ошибку.

- (id)initWithName: (NSString*)n instructions:(NSString*)inst explination:(NSString *)why imagePath:(NSString *)img {
    self = [super init];
    if (self) {
        self.name = n;
        self.instructions = inst;
        self.explanation = why;
        self.imagePath = img;
    }
    return self;
}

и метод кодирования:

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:name forKey:@"name"];
    [aCoder encodeObject:instructions forKey:@"instructions"];
    [aCoder encodeObject:explanation forKey:@"explanation"];
    [aCoder encodeObject:imagePath forKey:@"imagePath"];
}

Не обязательно, чтобы имя ключа совпадало с именем переменной.Вам не нужно делать это.Но, на мой взгляд, это добавляет ясности.Пока вы декодируете с тем же именем, которое использовали для кодирования, вы можете использовать все, что захотите.


Первая часть выполнена.Далее вам нужно загрузить и сохранить NSMutableArray в файл.Но для этого вам нужен путь к каталогу документов.Поэтому я создал небольшой вспомогательный метод, который используется в вашем контроллере.

- (NSString *)applicationDocumentsPath {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

Затем нам нужно загрузить массив с диска.

NSString *path = [[self applicationDocumentsPath] stringByAppendingPathComponent:@"some.fruits"];

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if (!array) {
    // if it couldn't be loaded from disk create a new one
    array = [NSMutableArray array];
}

Затем вы добавляете столько фруктов, сколько хотите.и, наконец, чтобы сохранить ваш массив на диск, вам нужна эта строка.

BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:path];

вы можете проверить результат, если архив был выполнен без ошибок.


Полагаю, это должно помочь вам начать.Удачного кодирования.

1 голос
/ 19 марта 2011

Вам нужно будет сохранить массив на диске и загрузить его при запуске приложения.

См. Ответ на этот вопрос.

0 голосов
/ 19 марта 2011

Чем вы должны прочитать об архивации: NSArchiver

Вам потребуется реализовать 2 метода для вашего класса Fruit:

EncodeWithEncoder и InitWithEncoder.

чем вы можете заархивировать свой массив фруктов. Удачи.

...