2011-01-11 3 views
0

Так как я новичок в программировании на iPhone и пытаюсь разобраться во всем этом, у меня есть проблема, когда я пытаюсь сохранить словарь на plist в следующем формате .. .Сохранение и извлечение нескольких словарей в файл plist

-Root 
    -StateName (Dictionary) 
     - TitleOfLocation (Dictionary) 
      -Address (String) 
      -City (String) 
      -State (String) 

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

В настоящее время я могу сохранить данные в одном словаре и записать его в PLST и потянуть его в UITableView (основы, да, я знаю), но, как я уже сказал, у меня просто проблемы с сохранением вложенных словарей.

Может кто-нибудь сможет направить меня в правильном направлении? Благодарю.

+0

Я уверен, что вы можете просто вставить словари в код. то есть. '[stateNameDictionary setObject: LocationDictionary forKey: @" TitleOfLocation "];' – mackross

ответ

0

Вы можете создавать вложенные массивы вместо вложенных словарей. И создайте еще один массив, который содержит имя состояния.

- Root (array) 
- Texas (array) 
    - Location1 (dictionary) 
    - TitleOfLocation (string) 
    - Address (string) 
    - ... 
- Florida (array) 
    - Location1 (dictionary) 
    - ... 
    - Location2 (dictionary) 
    - ... 
// and 
- StateNames (array) 
- Texas (string) 
- Florida (string) 

Для удобства вы можете поместить эти два массива в единый NSDictionary. Я не делал этого в моем примере.
И потому NSArray, NSDictionary и NSString все подтвердить в протоколе NSCoding вы можете написать этот словарь на диск с WriteToFile: атомарно:

Я написал некоторые примеры кода для вас, потому что я думаю, что решение является довольно простым, но трудно для описания словами.

#define kKeyDescription @"kKeyDescription" 
#define kKeyAddress  @"kKeyAddress" 
#define kKeyCity  @"kKeyCity" 
#define kKeyState  @"kKeyState" 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSMutableArray *root = [NSMutableArray array]; 
    NSMutableArray *sectionTitle = [NSMutableArray array]; 

    NSMutableArray *florida = [NSMutableArray array]; 
    [root addObject:florida]; 
    [sectionTitle addObject:@"Florida"]; 

    NSMutableArray *texas = [NSMutableArray array]; 
    [root addObject:texas]; 
    [sectionTitle addObject:@"Texas"]; 

    NSDictionary *location1 = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"My favorite pizza place", kKeyDescription, 
           @"5106 Grace Drive", kKeyAddress, 
           @"Miami", kKeyCity, 
           @"Florida", kKeyState, 
           nil]; 
    [florida addObject:location1]; 

    NSDictionary *location2 = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"Home", kKeyDescription, 
           @"1234 Foobar Street", kKeyAddress, 
           @"Fort Lauderdale", kKeyCity, 
           @"Florida", kKeyState, 
           nil]; 
    [florida addObject:location2]; 

    NSDictionary *location3 = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"Franks Workplace", kKeyDescription, 
           @"9101 Baz Avenue", kKeyAddress, 
           @"Houston", kKeyCity, 
           @"Texas", kKeyState, 
           nil]; 
    [texas addObject:location3]; 

    data = [root retain]; 
    sectionData = [sectionTitle retain]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [self.data count]; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    return [self.sectionData objectAtIndex:section]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [[self.data objectAtIndex:section] count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *cellID = @"MyCellID"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 
    if (!cell) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID] autorelease]; 
    } 
    NSDictionary *object = [[self.data objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
    //      < This is the array for the selected state > 
    cell.textLabel.text = [object valueForKey:kKeyDescription]; 
    cell.detailTextLabel.text = [object valueForKey:kKeyAddress]; 
    return cell; 
} 
+0

fluchtpunkt .... спасибо за объяснение и образец, что делает теперь больше смысла ... я собираюсь работать над этим тонитом и видеть с чем я могу согласиться. – Tate