Adicionando itens para NSMutableArray e poupança / carregamento

votos
2

Eu usei este tutorial para criar um aplicativo com uma exibição de tabela que é preenchida usando um NSMutableArray. Agora eu gostaria de adicionar a funcionalidade para adicionar itens adicionais para a matriz e salvar / carregá-los. Eu personalizei a classe Fruit para ficar assim:

#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

eo arquivo 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

e isso funciona muito bem, eu posso carregar duas TextViews e um imageView, em vez de apenas um textview. Mas como eu iria sobre como salvar quaisquer novos itens criados pelo usuário, e carregá-los (se existirem) quando o aplicativo é lançado de novo?

Publicado 19/03/2011 em 10:03
fonte usuário
Em outras línguas...                            


3 respostas

votos
8

para salvar sua matriz em disco você precisa de um par de coisas.

primeiro você precisa adicionar alguns métodos para a sua classe de frutas por isso está de acordo com o NSCoding protocolo.

O primeiro método é - (id)initWithCoder:(NSCoder *)aDecoder. Este método será chamado quando você cria um objeto de frutas a partir de um arquivo salvo.
Segundo método é - (void)encodeWithCoder:(NSCoder *)aCoder. Este método é usado para salvar o seu fruto em um arquivo.

Parece complicado? Na verdade não é. Apenas algumas linhas de fácil de entender o código.

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

Olhe para as duas primeiras linhas deste método init. Você tem que chamar [super init]e fazer uma verificação se selfnão é nulo em seu initWithName:instructions:explination:imagePath:método também. Não vai mudar nada neste caso especial, mas isso vai certamente mudar nos próximos poucas classes que você escreve. Para usá-lo o tempo todo.
Eu mudei isso para você. E eu mudei o erro de ortografia.

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

e o método de codificação:

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

Não é necessário que o nome da chave corresponda ao nome variável. Você não precisa fazer isso. Mas na minha opinião ele adiciona alguma clareza. Contanto que você decodificar com o mesmo nome que você usou para codificar você pode usar o que quiser.


Primeira parte está feita. Em seguida, você precisa carregar e salvar o seu NSMutableArray para um arquivo. Mas para fazer isso você precisa o caminho para o diretório de documentos. Então, eu criei um método auxiliar pouco que entra em seu controlador.

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

Então precisamos carregar a matriz do disco.

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

em seguida, você adicionar frutos tanto quanto você gosta e, finalmente, para salvar sua matriz em disco que você precisa esta linha.

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

você pode conferir resultado se o arquivo foi feito sem erro.


Eu acho que isso deve começar. Feliz codificação.

Respondeu 19/03/2011 em 10:47
fonte usuário

votos
1

Você precisaria persistir sua matriz no disco e carregá-lo quando o aplicativo lança.

Veja a resposta a esta pergunta.

Respondeu 19/03/2011 em 10:17
fonte usuário

votos
0

Do que você deve ler sobre o arquivamento: NSArchiver

Você precisaria implementar 2 método para sua classe Fruit:

EncodeWithEncodere InitWithEncoder.

do que você poderia arquivar você variedade de frutas. Boa sorte.

Respondeu 19/03/2011 em 10:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more