我目前有一个字典属性`scoreDictionary被构造,因此它包含本身就是嵌套字典的值:
{
Bob = {
"2013-08-02 00:27:02 +0000" = 70;
"2013-08-02 00:28:17 +0000" = 60;
};
Robert = {
"2013-08-02 02:53:19 +0000" = 1137;
};
Mooga = {
"2013-08-02 02:53:04 +0000" = 80;
};
}
我能够为所需方法tableView: numberOfRowsInSection:
返回正确的行数,但在编写tableView: cellForRowAtIndexPath:
时遇到问题。具体来说,由于必须有两个行显示相同的键“Bob”,但具有不同的得分和日期信息,我如何处理indexPath.row
以便它能够返回不同的信息虽然有相同的密钥,但每次呼叫时对于小区?
谢谢!
答案 0 :(得分:5)
目前尚不清楚您希望输出看起来像什么。如果你想要部分,名称是部分标题,你可以像下面这样做。由于您的数据结构,获取正确的数据看起来很复杂(使用一系列字典会更容易)。
- (void)viewDidLoad {
[super viewDidLoad];
self.theData = @{@"Bob":@{@"2013-08-02 00:27:02 +0000":@70, @"2013-08-02 00:28:17 +0000":@60}, @"Robert":@{@"2013-08-02 02:53:19 +0000":@1137}, @"Mooga":@{@"2013-08-02 02:53:04 +0000":@80}};
self.keys = self.theData.allKeys;
[self.tableView reloadData];
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
NSLog(@"sections are: %d",self.keys.count);
return self.keys.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.theData[self.keys[section]] count];
}
-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return self.keys[section];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = [self.theData[self.keys[indexPath.section]] allKeys][indexPath.row];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[self.theData[self.keys[indexPath.section]] valueForKey:[self.theData[self.keys[indexPath.section]] allKeys][indexPath.row]] ];
return cell;
}
这给出了这个输出(使用正确的细节单元格类型):
如果您不想要章节标题,可以删除titleForHeaderInSection方法,并将cellForRowAtIndexPath方法更改为:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSString *name = self.keys[indexPath.section];
NSString *date = [self.theData[self.keys[indexPath.section]] allKeys][indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",name,date];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[self.theData[self.keys[indexPath.section]] valueForKey:[self.theData[self.keys[indexPath.section]] allKeys][indexPath.row]] ];
return cell;
}
唯一的问题是,对于更长的名称,日期和时间字符串太长并且会切断数字值。因此,您可能需要缩短该字符串,或者转到字幕的字幕类型,其中该数字将位于单独的行中。
答案 1 :(得分:0)
只需为字典的每个名称(键)创建一个部分。在每个部分中,行将是条目日期/值。
即使你希望你的行在一起,也就是不要实现tableview的任何标题,因为这个带有tableView的解决方案/组织对你的问题来说是最好的。
如果您对此方法有任何帮助,请告诉我们,以便我们展示一些代码来指导您。
答案 2 :(得分:0)
根据您的示例NSDictionary(scoreDictionary),在tableview中显示“Bob”部分下的两个indexpath行,并在“Robert”和“Mooga”部分下显示一个indexpath行,请按照示例代码进行操作
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
return [[scoreDictionary allKeys] count];
}
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {
return [[scoreDictionary valueForKey:[[scoreDictionary allKeys] objectAtIndex:section]]count];
}
- (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section {
return [[scoreDictionary allKeys]objectAtIndex:section];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSDictionary *tempScoreDic = [scoreDictionary valueForKey:[[scoreDictionary allKeys]objectAtIndex:indexPath.section] ];
cell.textLabel.text = [NSString stringWithFormat:@"%@",[tempScoreDic valueForKey:[[tempScoreDic allKeys]objectAtIndex:indexPath.row]] ];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[[tempScoreDic allKeys]objectAtIndex:indexPath.row]];
return cell;
}