2

我创建了一个数组、两个字典和一个表格视图。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

4 回答 4

5

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

NSArray *keys

写在 viewDidLoad

keys = [mDictionary allKeys];

这在 cellForRowAtIndexPath

cell.textLabel.text = [mDictionary objectForKey:[keys objectAtIndex:indexPath.row];
于 2013-02-01T07:03:58.830 回答
2

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

[mArray objectAtIndex:indexPath.row];

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

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

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

顺便说一句,您没有使用ARC zo,您可能希望获得一个自动发布的 UITableViewCell,因此添加autorelease到您的单元格:

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

或者

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[cell autorelease];
于 2013-02-01T06:54:14.350 回答
0

数组包含类似类型的对象。您可以将字典对象添加到数组中。在这种情况下没有问题。问题是当您从数组中获取一个元素并分配给 cell.textLabel.text 时。这里的 object 是字典的类型,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;
    }

我想这会对你有所帮助。

于 2013-02-01T06:54:21.567 回答
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];
于 2016-05-04T06:18:41.480 回答