如何使用 objective-c 使用两个 NSMutableArray 填充可扩展 TableView

How to populate, Expandable TableView with two NSMutableArray using objective-c

我正在使用由 Tom Fewster 创建的 Expandable UITableview。我想使用两个 NSMutableArrays 来调整示例,如果有人想从 webservice json 数据中填充 expandable/collapse 树视图 table,这是一个场景。因此,由于在他的示例中 GroupCell 没有数组,我想知道我该怎么做?请记住,我的 Objective-C 仍然生锈,因此,我在问这个问题。

我的尝试只显示组的第一个 ObjectAtIndex:indexPath:0。

我希望能够填充 table 并获得这样的输出;

如果您能更好地理解答案,您也可以使用 JSON 数据来解释您的答案。

这里我想用 JSON 数据填充 table,以便 GroupCell 显示 class_name 和 rowCell 显示 subject_name。这是我从 JSON 网络服务解析内容的控制台;

(
    {
    "class_id" = 70;
    "class_name" = Kano;
    subject =         (

            "subject_id" = 159;
            "subject_name" = "Kano Class";
        }
    );
},
    {
    "alarm_cnt" = 0;

    "class_id" = 71;
    "class_name" = Lagos;
    subject =         (

            "subject_id" = 160;
            "subject_name" = "Lagos Class";
        }
    );
},
    {
    "alarm_cnt" = 3;
    "class_id" = 73;
    "class_name" = Nasarawa;
    subject =         (

            "subject_id" = 208;
            "subject_name" = "DOMA Class";
        },

            "subject_id" = 207;
            "subject_name" = "EGGON Class";
        },

            "subject_id" = 206;
            "subject_name" = "KARU Class";
        },

            "subject_id" = 209;
            "subject_name" = "LAFIA Class";
        },

            "subject_id" = 161;
            "subject_name" = "Nasarawa State Class";
        }
    );
},
    {
    "alarm_cnt" = 2;
    "class_id" = 72;
    "class_name" = Rivers;
    subject =         (

            "subject_id" = 162;
            "subject_name" = "Rivers Class";
        }
    );
}

)

我试过这是我的代码片段

- (UITableViewCell *)tableView:(ExpandableTableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{ 静态 NSString *CellIdentifier = @"RowCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

NSDictionary *d=[_sitesJson objectAtIndex:0] ;
NSArray *arr=[d valueForKey:@"subject_name"];
NSDictionary *subitems = [arr objectAtIndex:0];
NSLog(@"Subitems: %@", subitems);
NSString *siteName = [NSString stringWithFormat:@"%@",subitems];
cell.textLabel.text =siteName;
//}
NSLog(@"Row Cell: %@", cell.textLabel.text);
// just change the cells background color to indicate group separation
cell.backgroundView = [[UIView alloc] initWithFrame:CGRectZero];
cell.backgroundView.backgroundColor = [UIColor colorWithRed:232.0/255.0 green:243.0/255.0 blue:1.0 alpha:1.0];

return cell;

}

- (UITableViewCell *)tableView:(ExpandableTableView *)tableView cellForGroupInSection:(NSUInteger)section

{ 静态 NSString *CellIdentifier = @"GroupCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UILabel *textLabel = (UILabel *)[cell viewWithTag:2];
NSDictionary *d2 = [_regionsJson objectAtIndex:0];
NSArray *arr2 = [d2 objectForKey:@"class_name"];
NSString *regions = [[arr2 objectAtIndex:section]objectAtIndex:0];
textLabel.textColor  = [UIColor whiteColor];
textLabel.text = [NSString stringWithFormat: @"%@ (%d)", regions, (int)[self tableView:tableView numberOfRowsInSection:section]];
NSLog(@"Group cell label: %@", textLabel.text);

// We add a custom accessory view to indicate expanded and colapsed sections
cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ExpandableAccessoryView"] highlightedImage:[UIImage imageNamed:@"ExpandableAccessoryView"]];
UIView *accessoryView = cell.accessoryView;
if ([[tableView indexesForExpandedSections] containsIndex:section]) {
    accessoryView.transform = CGAffineTransformMakeRotation(M_PI);
} else {
    accessoryView.transform = CGAffineTransformMakeRotation(0);
}
return cell;

}

呵呵,只需要更新一个方法一点点就行了

- (UITableViewCell *)tableView:(ExpandableTableView *)tableView cellForGroupInSection:(NSUInteger)section
{
    static NSString *CellIdentifier = @"GroupCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSIndexPath *indexPath;
    NSString *regions = [[_dataGroup objectAtIndex:section]objectAtIndex:0];
    cell.textLabel.text = [NSString stringWithFormat: @"%@ ", regions];

    // We add a custom accessory view to indicate expanded and colapsed sections
    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ExpandableAccessoryView"] highlightedImage:[UIImage imageNamed:@"ExpandableAccessoryView"]];
    UIView *accessoryView = cell.accessoryView;
    if ([[tableView indexesForExpandedSections] containsIndex:section]) {
        accessoryView.transform = CGAffineTransformMakeRotation(M_PI);
    } else {
        accessoryView.transform = CGAffineTransformMakeRotation(0);
    }
    return cell; 
}

可以帮到你。

HTH,享受编码吧!!

我认为您需要创建一个具有部分数组的 TableView,并且每个部分行都将使用相应的部分数组填充。点击一个部分将展开它,所有行都将可见。

为了满足您的要求,您也可以按照以下步骤操作 -

1) 你的模式应该有一个部分数组。部分数组将包含部分对象、部分名称和相应的行数组。

2) 像

一样实现table视图的数据源方法
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView

{
    return [section count];
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

{
    return 50; // sections height
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return nil;
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return nil;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

    UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0 , 0, tableView.frame.size.width , 50)] autorelease];

    [view setBackgroundColor:[UIColor redColor]];
    view.layer.masksToBounds = YES;


    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5 , 2 , view.frame.size.width - 10 , view.frame.size.height - 3)];
    label.text = ((SectionObject *)[section objectAtIndex:indexPath.section]).sectionName;
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = NSTextAlignmentLeft;
    label.textColor = [UIColor WwhiteColor];
    label.clipsToBounds = YES;
    label.font = [UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:14.0f];
    label.layer.masksToBounds = YES;

    UIImageView *arrowImage = [[UIImageView alloc] initWithFrame:CGRectMake(view.frame.size.width - 30, 0, 17 , 17)];
    [arrowImage setCenter:CGPointMake(arrowImage.center.x , (view.frame.size.height/2) ) ];

    if(section == self.m_currentSelectedSection)
        [arrowImage setImage:self.m_upArrowImage];
    else
        [arrowImage setImage:self.m_downArrowImage];

    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)];
    button.tag = section;
    [button addTarget:self action:@selector(sectionTapped:) forControlEvents:UIControlEventTouchUpInside];
    button.backgroundColor = [UIColor clearColor];

    [view addSubview:label];
    [label release];

    [view addSubview:arrowImage];
    [arrowImage release];

    [view addSubview:button];
    [button release];

    view.clipsToBounds = YES;

    return view;
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger count = 0;

    if(self.m_currentSelectedSection == section)
              count = [((SectionObject *)[section objectAtIndex:indexPath.section]).rowArray count];

    return count;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 40.0;
}

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * cellId = @"cellIdentifier";

    UITableViewCell *cell = nil;

    cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellId];

    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    //customize cell
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}

每当点击任何部分时,都会调用以下事件

- (void) sectionTapped:(UIButton *)button
{
    self.m_currentSelectedSection = button.tag;
    [self performSelector:@selector(refreshView) withObject:nil afterDelay:POINT_ONE_SECOND];
    if(m_winnerSlotList->at(self.m_currentSelectedSection).m_leaderboardList.size())
        [self.m_leaderboardTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:button.tag] atScrollPosition:UITableViewScrollPositionTop animated:YES];

    UIView *baseView = [button superview];
    if(baseView)
    {
        for(int ii = 0 ; ii < [[baseView subviews] count] ; ii++ )
        {
            UIView *anyView = [[baseView subviews] objectAtIndex:ii];
            if([anyView isKindOfClass:[UIImageView class]])
                [(UIImageView *)anyView setImage:self.m_upArrowImage];
        }
    }
}

初始化self.m_currentSelectedSection = 0,这是第一次,这将显示第 0 个部分的行。当点击任何部分时,它的行将可见(相应的部分行将展开)并且上一个选定部分的行将被隐藏(之前的部分行将折叠)。

如果您需要将多个部分显示为已展开,那么您需要跟踪所有部分是否展开某个部分,并相应地加载显示/隐藏相应部分的单元格。