Note that there are some explanatory texts on larger screens.

plurals
  1. POexpandable list view in iOS
    primarykey
    data
    text
    <p>I need to create expandable list view in my iOS app, ie. if you tap on a cell, it should expand to give more cells. I'm following the example given on this link: <a href="https://stackoverflow.com/questions/13074713/toggle-showing-hiding-child-table-cells-ios">Toggle showing/hiding child table cells iOS</a> The code for the implementation file is given here too: <a href="http://pastie.org/7756763" rel="nofollow noreferrer">http://pastie.org/7756763</a></p> <p>However, in the example above the arrays are fixed. I have a sqlite database where I store tasks and their start dates, among other things. I need to create an expandable view where the different rows are the different start dates and when I tap on a date, it should give the tasks for that date. Here's the code:</p> <pre><code>- (void)viewDidLoad { [super viewDidLoad]; allDates = [[NSMutableArray alloc]init]; self.date = [[NSMutableArray alloc] initWithObjects: nil]; // self.date = [[NSMutableArray alloc]init]; self.listOfSections_DataSource = [[NSMutableArray alloc]initWithObjects:nil]; sqlite3_stmt *statement; const char *dbpath = [mDatabasePath UTF8String]; if (sqlite3_open(dbpath,&amp;mDiary)== SQLITE_OK) { NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"]; const char *query_stmt = [selectSQL UTF8String]; if (sqlite3_prepare_v2(mDiary, query_stmt, -1, &amp;statement, NULL) == SQLITE_OK) { while(sqlite3_step(statement) == SQLITE_ROW) { tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]; [allDates addObject:[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]]; [self.date addObject:tempTaskName]; } } sqlite3_finalize(statement); } sqlite3_close(mDiary); NSLog(@"%i",[allDates count]); for(int x = 0;x &lt; [allDates count];x++) { if (sqlite3_open(dbpath,&amp;mDiary)== SQLITE_OK) { NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"]; const char *query_stmt = [selectSQL UTF8String]; if (sqlite3_prepare_v2(mDiary, query_stmt, -1, &amp;statement, NULL) == SQLITE_OK){ temp = [[NSMutableArray alloc]init]; while(sqlite3_step(statement) == SQLITE_ROW) { tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]; NSLog(@"%@",tempTaskName); // [allDates addObject:[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]]; if([[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)] isEqualToString:allDates[x]]) { [self.temp addObject:tempTaskName]; } } NSLog(@"task name%@",temp); [listOfSections_DataSource addObject:temp]; } sqlite3_finalize(statement); } sqlite3_close(mDiary); } //[self.listOfSections_DataSource addObject:allDates]; NSMutableArray *emptyArray = [[NSMutableArray alloc]init]; listOfSections = [[NSMutableArray alloc]init]; for (int i = 0;i&lt;[allDates count]; i++) { [listOfSections addObject:emptyArray]; } self.selectedSection = -1; self.selectedSectionTail = -1; } </code></pre> <p>the table view methods are:</p> <pre><code>- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [listOfSections_DataSource count]; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(selectedSection !=section) return 1; else{ NSArray *array = [listOfSections objectAtIndex:section]; return [array count]; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"cell"; if(self.selectedSection == indexPath.section){//this is just to check to see if this section is the one we touched UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } NSArray *myArray = [listOfSections_DataSource objectAtIndex:indexPath.section];//this now contains your cities NSString* myString = [myArray objectAtIndex:indexPath.row]; // get city for that row, under the state cell.textLabel.text = myString; return cell; } else{//THIS IS going to happen the first time UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } cell.textLabel.text = @"more"; return cell; } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; //check to see if the cell is for exapnding or for selection if([cell.textLabel.text isEqualToString:@"more"]){ // this means we need to expand listOfSections = [[NSMutableArray alloc]init]; //setting up the list of section with empty arrays NSMutableArray *emptyArray = [[NSMutableArray alloc]init]; for (int i = 0;i&lt;[allDates count]; i++) { [listOfSections addObject:emptyArray]; } //Add array of tasks here [listOfSections replaceObjectAtIndex:indexPath.section withObject:[listOfSections_DataSource objectAtIndex:indexPath.section]]; int tapedRow = [indexPath section]; self.selectedSection = tapedRow; NSMutableIndexSet *myIndexSet = [[NSMutableIndexSet alloc]init]; [myIndexSet addIndex:selectedSection]; [myIndexSet addIndex:selectedSectionTail]; // Updating section in the tableview if(selectedSectionTail!=-1) [taskTable reloadSections:(NSIndexSet*)myIndexSet withRowAnimation:UITableViewRowAnimationFade]; else { [taskTable reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation: UITableViewRowAnimationFade]; } //[taskTable reloadData]; } else{ } selectedSectionTail = selectedSection; } </code></pre> <p>The problem here is that: 1. No. of sections that shows on screen is correct but when the first cell is tapped, it disappears. 2. the list doesn't get expanded when any of the cells is tapped.</p> <p>Please can anyone help me out? Thanks..</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload