我创建了一个数组,两个词典和一个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
答案 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];