0

我目前有一个字典属性`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以便它能够在每次调用单元格时返回不同的信息,尽管具有相同的键?

谢谢!

4

3 回答 3

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;
}

唯一的问题是,对于较长的名称,日期和时间字符串太长并且会截断数字值。因此,您要么需要缩短该字符串,要么转到该数字将位于单独一行的单元格的字幕类型。

于 2013-08-04T06:11:08.337 回答
0

只需为字典的每个名称(键)创建一个部分。在每个部分中,该行将是条目日期/值。

即使您希望您的行在一起,也不要实现 tableview 的任何标题,因为 tableView 的这种解决方案/组织对您的问题来说是最好的。

如果您需要有关此方法的任何帮助,请告诉我们,以便我们显示一些代码来指导您。

于 2013-08-04T05:34:13.820 回答
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;




}
于 2013-08-04T06:32:13.420 回答