将plist加载到iOS TableView中

时间:2012-02-03 14:32:45

标签: ios uitableview plist nsdictionary

我有一个带有以下内容的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];

以下是我正在尝试将fileName加载到Prototype Cells中。

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!",那么我会看到“你好!”对于NSDictionary中的每个项目。我对//Configure the cell部分

有困难

不幸的是,这不符合我的预期。我有困难,因为我认为我的钥匙都是数字。

更新

尝试使用我从下面的答案中学到的东西,我有这个:

// 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个元素的正确fileName。知道为什么[NSNumber numberWithInt:indexPath.row无效吗?

3 个答案:

答案 0 :(得分:2)

你可以这样做:

NSDictionary *dict = [self.roster objectForKey:indexPath.row];
NSString *fileName = [dict objectForKey:@"fileName"];

答案 1 :(得分:0)

正如Oscar所指出的那样,self.roster是一个NSDictionary,每个数字键都有一个字典。

您必须首先检索数字键的NSDictionary:NSDictionary *fileDictionary = [self.roster objectForKey:indexPath.row];

之后,您必须从最后一个字典中提取文件名,因此您必须为@“fileName”键请求字符串。

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

答案 2 :(得分:0)

不确定你是否已经解决了这个问题,但下面就是我解决这个问题的方法。

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

我认为原因是[NSNumber numberWithInt:indexPath.row]返回number / int值。 但是objectForKey:期望收到一个字符串值。

希望得到这个帮助。