Невозможно сохранить NSMutableArray моего класса в файл (IOS) - PullRequest
2 голосов
/ 18 марта 2012

Не могу узнать, почему мой код не работает. Пожалуйста, помогите кому-нибудь.

Я создал свой собственный класс, реализовал протокол NSCoding. Не знаю, что мне не хватает или не так.

Вот код сохранения

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:@"Currency.plist"]; 

Item * item = [[Item alloc] init];
item.x = 3; item.y = 5; item.type = (TType) 3; item.isSelected = NO;

NSMutableArray * array = [[NSMutableArray alloc] init];
[array addObject:item];

[array fileName atomically:YES]  // ( Doesn't Save the file ,returns NO);

Вот код моего класса * .h *

#import <Foundation/Foundation.h> 

enum TType 
{
    kNone = 0, 
    KFirst = 1,
    ....
}; 

@interface Item : NSObject <NSCoding>{

}  

@property (nonatomic) int x;
@property (nonatomic) int y;
@property (nonatomic) enum TType type;
@property (nonatomic) BOOL isSelected;

@end

.m

@implementation Item
@synthesize x, y , type , isSelected;

#pragma mark NSCoding Protocol

- (void)encodeWithCoder:(NSCoder *)encoder;
{
  [encoder encodeInt32:[self x] forKey:@"x"];
  [encoder encodeInt32:[self y] forKey:@"y"];
  [encoder encodeInt32:[self type] forKey:@"type"];
  [encoder encodeBool:[self isSelected] forKey:@"isSelected"];
}

- (id)initWithCoder:(NSCoder *)decoder;
{
    if ( ![super init] )
        return nil;

    [self setX:[decoder decodeInt32ForKey:@"x"]];
    [self setY:[decoder decodeInt32ForKey:@"y"]];
    [self setType:(TType)[decoder decodeInt32ForKey:@"color"]];
    [self setIsSelected:[decoder decodeBoolForKey:@"isSelected"]];

    return self;
}

@end

1 Ответ

4 голосов
/ 18 марта 2012

Я думаю, вы найдете ответ по адресу: объекты, соответствующие nscoding, не будут записаны в файл

т.е. Вы не можете сериализовать свой класс Item в список свойств, поскольку он не является объектом списка свойств (NSString, NSData, NSArray или NSDictionary).

См. Документацию для writeToFile:atomically::

Этот метод рекурсивно проверяет, что все содержащиеся объекты являются объектами списка свойств перед записью файла, и возвращает NO, если все объекты не являются объектами списка свойств, поскольку результирующий файл не будет действительным списком свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...