在tableview中显示数组和字典值

时间:2013-02-01 06:45:05

标签: ios objective-c nsmutablearray

我创建了一个数组,两个词典和一个tableview。 tableview应显示数组的内容,该数组包含字典数据。当我尝试使用" [mArray addObject:(mDictionary)];"如果我使用" [mArray addObject:[mDictionary objectForKey:@" firstname"]];"它的工作正常。

你能帮助我理解它为什么会发生,并且不使用" objectForKey"显示字典值?

这是我的" ViewController.m"。

#import "ViewController.h"

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    mArray = [[NSMutableArray alloc]init];
    mDictionary = [[NSMutableDictionary alloc]init];
    [mDictionary setValue:@"shanu" forKey:@"firstname"];
    [mDictionary setValue:@"kumar" forKey:@"lastname"];
    mDictionary2 = [[NSMutableDictionary alloc]init];
    [mDictionary2 setValue:@"hgjghjgf" forKey:@"firstname1"];
    [mDictionary2 setValue:@"ghjgjgfj" forKey:@"lastname1"];
    [mArray addObject:mDictionary];
    [mArray addObject:mDictionary2];

    CGRect frame = self.view.frame;
    UITableView *tableView = [[UITableView alloc]initWithFrame:frame style:UITableViewStylePlain];
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    tableView.backgroundColor = [UIColor cyanColor];
    tableView.separatorColor = [UIColor blackColor];
    tableView.delegate = self;
    tableView.dataSource = self;
    [self.view addSubview:tableView];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return @"Array and Tableview";
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return mArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    cell.textLabel.text = [mArray objectAtIndex:indexPath.row];
    return cell;
}

- (void)dealloc
{
    [mArray release];
    [mDictionary release];
    [mDictionary2 release];
    [super dealloc];
}
@end

4 个答案:

答案 0 :(得分:5)

在.h文件中声明一个数组:

NSArray *keys

在viewDidLoad中写这个

keys = [mDictionary allKeys];

这在cellForRowAtIndexPath

cell.textLabel.text = [mDictionary objectForKey:[keys objectAtIndex:indexPath.row];

答案 1 :(得分:2)

如果您尝试将某些文本分配给单元格的textlabel,则返回的对象为:

[mArray objectAtIndex:indexPath.row];

应该是字符串而不是整个字典。

当您将整个字典放入数组[mArray objectAtIndex:indexPath.row];时,将返回一个字典,您无法将字典分配给textlabel,因此您将获得异常。如果要存储整个字典,请使用objectForKey来获取所需的字符串:

cell.textLabel.text = [[mArray objectAtIndex:indexPath.row] objectForKey:@"WHAT_EVER_KEY_YOU_WANT"];

顺便说一下,你没有使用ARC你可能想要获得一个自动释放的UITableViewCell,所以要向你的单元格添加autorelease

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"] autorelease];

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[cell autorelease];

答案 2 :(得分:0)

Array包含类似的类型对象。您可以将字典对象添加到数组中。在这种情况下没有问题。问题是当你从数组中获取一个元素并分配给cell.textLabel.text时。这里的对象是字典的类型,cell.textLabel.text是nsstring的类型。因此,您应该为字典对象的键分配一个值到cell.textLabel.text。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    cell.textLabel.text = [[mArray objectAtIndex:indexPath.row] objectForKey:@"firstname"];
cell.detialTextLabel.text = [[mArray objectAtIndex:indexPath.row] objectForKey:@"lastname"];
        return cell;
    }

我认为这会对你有所帮助。

答案 3 :(得分:0)

这解决了我的问题

NSDictionary *cellDict = [self.tableInfoArr objectAtIndex:indexPath.row];

//This is to don't care about what is key and value in that dictionary
NSArray *keyArr = [cellDict allKeys];

//As at each index of array only one dictionary exist.
NSString *keyStr = [keyArr objectAtIndex:0];

cell.titleLabel.text =  keyStr;
cell.detailLabel.text =  [cellDict valueForKey:keyStr];