There Is this control that I really appreciate: github link the problem is that now I have a situation where when I need to open one row and all the previous ones should close, I can only have one open row at the time.
Since I'm not very experienced with xcode, I need some info on where should I start and the necessary steps to make the code work the way I need right now.
I managed to make some tests but not a viable solution, here is what I have right now:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSInteger row = indexPath.row;
if (indexPath.section == 0) {
NSLog(@"indexPath1 = %i", selectedRow);
NSDictionary *d = [self.firstForTable objectAtIndex:indexPath.row];
if([d valueForKey:@"Objects"]) {
NSArray *ar = [d valueForKey:@"Objects"];
NSUInteger count = indexPath.row +1;
NSMutableArray *arCells = [NSMutableArray array];
for(NSDictionary *dInner in ar ) {
[arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]];
[self.firstForTable insertObject:dInner atIndex:count++];
}
[tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft];
}
else {
NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"name"],[d valueForKey:@"book"]);
}
if (selectedRow == row) {
NSLog(@"selectedRow2 = %i",selectedRow);
NSDictionary *d=[self.firstForTable objectAtIndex:selectedRow];
if([d valueForKey:@"Objects"]) {
NSArray *ar = [d valueForKey:@"Objects"];
[self miniMizeFirstsRows:ar];
}
selectedRow = -1;
return;
}
if (selectedRow >= 0) {
NSLog(@"selectedRow3 = %i",selectedRow);
NSDictionary *d=[self.firstForTable objectAtIndex:selectedRow];
if([d valueForKey:@"Objects"]) {
NSArray *ar = [d valueForKey:@"Objects"];
[self miniMizeFirstsRows:ar];
}
selectedRow = row;
}
selectedRow = row;
[tableView beginUpdates]; [tableView endUpdates];
}
if (indexPath.section == 1) {
NSDictionary *d = [self.secondForTable objectAtIndex:indexPath.row];
if([d valueForKey:@"Objects"]) {
NSArray *ar = [d valueForKey:@"Objects"];
BOOL isAlreadyInserted=NO;
for (NSDictionary *dInner in ar) {
NSInteger index = [self.secondForTable indexOfObjectIdenticalTo:dInner];
isAlreadyInserted = (index > 0 && index != NSIntegerMax);
if (isAlreadyInserted) break;
}
if (isAlreadyInserted) {
[self miniMizeSecondsRows:ar];
}
else {
NSUInteger count = indexPath.row+1;
NSMutableArray *arCells = [NSMutableArray array];
for (NSDictionary *dInner in ar ) {
[arCells addObject:[NSIndexPath indexPathForRow:count inSection:1]];
[self.secondForTable insertObject:dInner atIndex:count++];
}
[tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft];
}
}
else {
NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"name"],[d valueForKey:@"book"]);
}
}
}
Thanks in Advance.
UPDATED: Expandable Rows JSON is your project, with auto-collapse working for all rows.
Also check Expandable Rows, i forked this project to help Novara and improve it. Now working for all sections, except nested rows.
FIRST STEP
Track opened row for each section. Of course this can be done using NSArray
of tabOpened for multiple sections.
@interface RootViewController : UITableViewController {
NSInteger tabOpened_1;
NSInteger tabOpened_2;
}
SECOND STEP
Next initialize those with "-1" value, for none opened tab.
- (void)viewDidLoad
{
........
[self.firstForTable addObjectsFromArray:self.firstArray];
tabOpened_1 = -1;
[self.secondForTable addObjectsFromArray:self.secondArray];
tabOpened_2 = -1;
}
THIRD STEP
Change the didSelectRowAtIndexPath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.section==0) {
NSDictionary *d=[self.firstForTable objectAtIndex:indexPath.row];
if([d valueForKey:@"produtos"]) {
if (tabOpened_1 == -1) {
NSLog(@"No tab opened in first section");
tabOpened_1 = indexPath.row;
} else if(tabOpened_1 != indexPath.row && tabOpened_1 > indexPath.row){
NSDictionary *d_ = [self.firstForTable objectAtIndex:tabOpened_1];
NSArray *ar_ = [d_ valueForKey:@"produtos"];
[self miniMizeFirstsRows:ar_];
tabOpened_1 = indexPath.row;
}
NSArray *ar=[d valueForKey:@"produtos"];
BOOL isAlreadyInserted=NO;
for(NSDictionary *dInner in ar ){
NSInteger index=[self.firstForTable indexOfObjectIdenticalTo:dInner];
isAlreadyInserted=(index>0 && index!=NSIntegerMax);
if(isAlreadyInserted) break;
}
if(isAlreadyInserted) {
[self miniMizeFirstsRows:ar];
} else {
NSUInteger count=indexPath.row+1;
NSMutableArray *arCells=[NSMutableArray array];
for(NSDictionary *dInner in ar ) {
[arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]];
[self.firstForTable insertObject:dInner atIndex:count++];
}
[tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft];
}
if (tabOpened_1 == -1) {
NSLog(@"No tab opened in first section");
tabOpened_1 = indexPath.row;
} else if(tabOpened_1 != indexPath.row && tabOpened_1 < indexPath.row){
NSDictionary *d_ = [self.firstForTable objectAtIndex:tabOpened_1];
NSArray *ar_ = [d_ valueForKey:@"produtos"];
[self miniMizeFirstsRows:ar_];
tabOpened_1 = indexPath.row - [ar_ count];
tabOpened_1 = (tabOpened_1 < 0) ? indexPath.row : tabOpened_1;
}
} else {
NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"nome"],[d valueForKey:@"numeroConta"]);
}
for (int i=0; i < [[self.rowsPerSection objectAtIndex:indexPath.section] integerValue]; i++) {
NSDictionary *d_ = [self.secondForTable objectAtIndex:i];
NSArray *ar_ = [d_ valueForKey:@"produtos"];
[self miniMizeSecondsRows:ar_];
}
}
if (indexPath.section==1) {
if (tabOpened_2 == -1) {
NSLog(@"No tab opened in second section");
tabOpened_2 = indexPath.row;
} else if(tabOpened_2 != indexPath.row && tabOpened_2 > indexPath.row){
NSDictionary *d_ = [self.secondForTable objectAtIndex:tabOpened_2];
NSArray *ar_ = [d_ valueForKey:@"produtos"];
[self miniMizeSecondsRows:ar_];
tabOpened_2 = indexPath.row;
}
NSDictionary *d=[self.secondForTable objectAtIndex:indexPath.row];
if([d valueForKey:@"produtos"]) {
NSArray *ar=[d valueForKey:@"produtos"];
BOOL isAlreadyInserted=NO;
for(NSDictionary *dInner in ar ){
NSInteger index=[self.secondForTable indexOfObjectIdenticalTo:dInner];
isAlreadyInserted=(index>0 && index!=NSIntegerMax);
if(isAlreadyInserted) break;
}
if(isAlreadyInserted) {
[self miniMizeSecondsRows:ar];
} else {
NSUInteger count=indexPath.row+1;
NSMutableArray *arCells=[NSMutableArray array];
for(NSDictionary *dInner in ar ) {
[arCells addObject:[NSIndexPath indexPathForRow:count inSection:1]];
[self.secondForTable insertObject:dInner atIndex:count++];
}
[tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft];
}
if (tabOpened_2 == -1) {
NSLog(@"No tab opened in second section");
tabOpened_2 = indexPath.row;
} else if(tabOpened_2 != indexPath.row && tabOpened_2 < indexPath.row){
NSDictionary *d_ = [self.secondForTable objectAtIndex:tabOpened_2];
NSArray *ar_ = [d_ valueForKey:@"produtos"];
[self miniMizeSecondsRows:ar_];
tabOpened_2 = indexPath.row - [ar_ count];
tabOpened_2 = (tabOpened_2 < 0) ? indexPath.row : tabOpened_2;
}
} else {
//NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"nome"],[d valueForKey:@"book"]);
}
for (int i=0; i < [[self.rowsPerSection objectAtIndex:indexPath.section] integerValue]; i++) {
NSDictionary *d_ = [self.firstForTable objectAtIndex:i];
NSArray *ar_ = [d_ valueForKey:@"produtos"];
[self miniMizeFirstsRows:ar_];
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With