TestsTested | ✗ |
LangLanguage | Obj-CObjective C |
License | MIT |
ReleasedLast Release | Feb 2016 |
Maintained by Joey Lee.
An accordion controller based on UITableView.
Please check out the demo project in the repository.
There are 2 types of cell, Parent and Child. You need to create parent data and child data for each cells.
[JLAccordionData parentDataWithIdentifier:@"parent_001"
userData:@{@"title":@"Hello"}];
[JLAccordionData childDataWithIdentifier:@"child_001"
parentIdentifier:@"parent_001"
userData:@{@"title":@"World"}];
self.accordionDataController = [JLAccordionDataController alloc] init];
self.accordionDataController.accordionDelegate = self;
[self.accordionDataController setParentDataArray:(array of parent data)
childDataArray:(array of child data)];
UITableViewDataSource UITableViewDelegate JLAccordionDelegate
#pragma mark - <UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.accordionDataController numberOfRows];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
JLAccordionData *data = [self.accordionDataController dataForIndex:indexPath.row];
if( [data isParentData] ) {
ParentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ParentCell" forIndexPath:indexPath];
cell.titleLabel.text = data.userData[@"title"];
cell.arrowImageView.hidden = ![self.accordionDataController hasChildForIdentifier:data.identifier];
[cell setOpened:[self.accordionDataController isOpenedForIdentifier:data.identifier] animated:NO];
return cell;
}
else {
ChildTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ChildCell" forIndexPath:indexPath];
cell.titleLabel.text = data.userData[@"title"];
return cell;
}
return nil;
}
#pragma mark - <UITableViewDelegate>
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.accordionDataController toggleCellForIndexPath:indexPath tableView:tableView];
}
#pragma mark - <JLAccordionDelegate>
- (void)accordionTableView:(UITableView *)tableView shouldOpenCellForIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if([[cell class] isSubclassOfClass:[ParentTableViewCell class]]) {
ParentTableViewCell *parentCell = (ParentTableViewCell *)cell;
[parentCell setOpened:YES animated:YES];
}
}
- (void)accordionTableView:(UITableView *)tableView shouldCloseCellForIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if([[cell class] isSubclassOfClass:[ParentTableViewCell class]]) {
ParentTableViewCell *parentCell = (ParentTableViewCell *)cell;
[parentCell setOpened:NO animated:YES];
}
}
sample of parent data : (
"identifier : 100, parentIdentifier : (null), userData : {title : Hello}",
"identifier : 200, parentIdentifier : (null), userData : {title : World}",
"identifier : 300, parentIdentifier : (null), userData : {title : Amazing}",
"identifier : 400, parentIdentifier : (null), userData : {title : Don't worry}",
"identifier : 500, parentIdentifier : (null), userData : {title : Be Happy}"
)
sample of child data : (
"identifier : 101, parentIdentifier : 100, userData : {title : Hello1}",
"identifier : 102, parentIdentifier : 100, userData : {title : Hello2}",
"identifier : 103, parentIdentifier : 100, userData : {title : Hello3}",
"identifier : 104, parentIdentifier : 100, userData : {title : Hello4}",
"identifier : 201, parentIdentifier : 200, userData : {title : World1}",
"identifier : 202, parentIdentifier : 200, userData : {title : World2}",
"identifier : 203, parentIdentifier : 200, userData : {title : World3}",
"identifier : 204, parentIdentifier : 200, userData : {title : World4}",
"identifier : 501, parentIdentifier : 500, userData : {title : show me the money}",
"identifier : 502, parentIdentifier : 500, userData : {title : operation cwal}",
"identifier : 503, parentIdentifier : 500, userData : {title : power overwhelming}"
)
Licensed under the MIT license. You can use the code in your commercial and non-commercial projects.