Загрузка plist в iOS TableView - PullRequest
       5

Загрузка plist в iOS TableView

1 голос
/ 03 февраля 2012

У меня есть plist ( images.plist ) со следующим содержанием

images.plist

Как видите, у каждого элемента есть цифровая клавиша от 0 до 19. Каждый элемент также имеет две строки (fileName и fileInfo).

Я пытаюсь загрузить все fileName в TableView. Вот моя попытка:

RosterMasterViewController.h

@interface RosterMasterViewController : UITableViewController

@property (nonatomic, strong) NSDictionary *roster;

@end

RosterMasterViewController.m

@implementation RosterMasterViewController

@synthesize roster = _roster;

...
// This is in my 'viewDidLoad'
NSString *file = [[NSBundle mainBundle] pathForResource:@"images" ofType:@"plist"];
self.roster = [NSDictionary dictionaryWithContentsOfFile:file];

А вот как я пытаюсь загрузить имя файла в ячейки прототипа.

RosterMasterViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"imageNameCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell
    cell.textLabel.text = [[[self.roster allKeys] objectAtIndex:indexPath.row] objectForKey:@"fileName"];
   return cell;
}

Примечание Для записи, мой CellIdentifier является правильным, если я установлю для cell.textLabel.text значение @"HELLO!", тогда я увижу «HELLO!» для каждого элемента в NSDictionary. У меня проблемы с разделом //Configure the cell

К сожалению, это не работает, как я ожидал. Я испытываю затруднения, так как мои ключи все числовые, я думаю.

UPDATE

Пытаясь использовать то, что я узнал из ответов ниже, у меня есть это:

// Configure the cell
NSLog(@"Key: %@", [NSNumber numberWithInt:indexPath.row]);
NSDictionary *dict = [self.roster objectForKey:[NSNumber numberWithInt:indexPath.row]];
NSLog(@"Dictionary: %@", dict);
NSString *fileName = [dict objectForKey:@"fileName"];
NSLog(@"FileName: %@", fileName);

cell.textLabel.text = fileName;
return cell;

Но это дает мне такие результаты, как:

2012-02-03 11:24:24.295 Roster[31754:f803] Key: 7
2012-02-03 11:24:24.295 Roster[31754:f803] Dictionary: (null)
2012-02-03 11:24:24.296 Roster[31754:f803] FileName: (null)

Если я изменю эту строку:

NSDictionary *dict = [self.roster objectForKey:[NSNumber numberWithInt:indexPath.row]];

до:

NSDictionary *dict = [self.roster objectForKey:@"5"];

Тогда все ячейки будут иметь правильное имя файла для 6-го элемента. Есть идеи, почему [NSNumber numberWithInt:indexPath.row не работает?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

Вы можете сделать это:

NSDictionary *dict = [self.roster objectForKey:indexPath.row];
NSString *fileName = [dict objectForKey:@"fileName"];
0 голосов
/ 29 марта 2012

Не уверен, что вы уже решили проблему, но ниже приведен способ, как я решил эту проблему.

NSDictionary *dict = 
[self.allItem objectForKey:[NSString stringWithFormat:@"%d",indexPath.row]];

Я думаю, что причина была [NSNumber numberWithInt:indexPath.row] в возврате значения число / intНо objectForKey: ожидает получения строкового значения.

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

0 голосов
/ 03 февраля 2012

Как отметил Оскар, self.roster - это NSDictionary, внутри которого есть словари для каждого числового ключа.

Сначала необходимо получить NSDictionary для числового ключа: NSDictionary *fileDictionary = [self.roster objectForKey:indexPath.row];

После этого вы должны извлечь ваше имя файла из этого последнего словаря, поэтому вы должны запросить строку для ключа @ "fileName".

    NSString *fileName = [fileDictionary objectForKey:@"fileName"];
    cell.textLabel.text = fileName;
    return cell;
...