Как читать данные из plist в модель данных? - PullRequest
2 голосов
/ 15 сентября 2011

Я запустил свое приложение, жестко закодировав некоторые статические данные (информацию об отеле) внутри моей модели данных, чтобы они были доступны везде в моем приложении.Это было нормально, пока список не начал расти (все еще статические данные).Я пытаюсь выяснить, как воссоздать жестко закодированные данные, используя вместо этого plist.Кажется прямолинейным, но не может понять это.

Мой заголовок объекта "hotel":

@interface Hotel : NSObject {}

@property (nonatomic, assign) int HotelID;
@property (nonatomic, copy) NSString* Name;
@property (nonatomic, copy) int Capacity;

@end

Реализация моего объекта "hotel":

@implementation Hotel

@synthesize HotelID, Name, Capacity;

-(void)dealloc {
    [Name release];
    [Capacity release];
}

Объект "Отель" управляется моей DataModel.Заголовок для DataModel:

@class Hotel;

@interface DataModel : NSObject {}

-(int)hotelCount;

Реализация DataModel:

#import "DataModel.h"
#import "Hotel.h"

// Private methods
@interface DataModel ()

@property (nonatomic, retain) NSMutableArray *hotels;

-(void)loadHotels;

@end

@implementation DataModel

@synthesize hotels;

- (id)init {
    if ((self = [super init])) {
        [self loadHotels];
    }
    return self;
}

- (void)dealloc {
    [hotels release];
    [super dealloc];
}

- (void)loadHotels

hotels = [[NSMutableArray arrayWithCapacity:30] retain];

Hotel *hotel = [[Hotel alloc] init];
hotel.HotelID = 0;
hotel.Name = @"Solmar";
hotel.Capacity = 186;
// more data to be added eventually
[hotels addObject:hotel];
[hotel release];

Hotel *hotel = [[Hotel alloc] init];
hotel.HotelID = 1;
hotel.Name = @"Belair";
hotel.Capacity = 389;
[hotels addObject:hotel];
[hotel release];

// and so on... I have 30 hotels hard coded here.

- (int)hotelCount {
    return self.hotels.count;
}

@end

Эта настройка работает нормально.Однако я не могу понять, как реализовать раздел loadHotel, где данные жестко запрограммированы.Я хотел бы заменить это списком с той же информацией.Как мне прочитать в файле plist информацию о назначении каждой клавиши (имя, емкость и т. Д.)?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Как только вы создадите список, вы можете загрузить его содержимое в словарь следующим образом:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:plistFileName ofType:nil];
NSDictionary *plistDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];

Затем вы можете запросить любые данные, которые вам нужны, используя ключи из списка:

NSArray *hotelsFromPlist = [plistDict objectForKey:"hotels"];

// remember this is autoreleased, so use alloc/initWithCapacity of you need to keep it
NSMutableArray *hotels = [NSMutableArray arrayWithCapacity:[hotelsFromPlist count]];

for (NSDictionary *hotelDict in hotelsFromPlist) {
    Hotel *hotel = [[Hotel alloc] init];
    hotel.name = [hotelDict objectForKey:@"name"];
    hotel.capacity = [hotelDict objectForKey:@"capacity"];
    [hotels addObject:hotel];
}

Надеюсь, это поможет.

отредактировано для корректности кода

0 голосов
/ 15 сентября 2011

Вы должны привести свой объект в соответствие с протоколом NSCoding ... Это значит, что вам нужно реализовать два метода (не забудьте объявить ваш объект как

@interface Hotel : NSObject<NSCoding>{
   //your declarations here...
}

и реализацию

@implementation Hotel
////
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:Name forKey:someKeyRepresentingProperty];
    //and so one...
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [self init];
    if(self){
        self.Name = [aDecoder decodeObjectForKey:someKeyRepresentingProperty];
        //and so one...
    }
    return self;
}

Тогда вы сможете довольно легко хранить и читать ваши объекты.

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