Note that there are some explanatory texts on larger screens.

plurals
  1. POCustom UITableViewCell Created Twice ... Driving me mad
    text
    copied!<p>I have created a custom UITableViewCell which I want to dynamically expand and contract when a button is press on the cell. The method is called when the button is pressed but it would appear that the cell is getting created twice.... Therefore resetting the state... I have been pouring over this for days trying different things but am at a loss as to what is wrong...</p> <pre><code>- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"CategoryCell"; // Create a new Cell if necessary CategoryCell *cell = (CategoryCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[CategoryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.frame = CGRectMake(0.0, 0.0, 320.0, 67.0); NSLog( @"Cell Creation - Row %d", indexPath.row ); [cell.expandContractButton addTarget:self action:@selector(expandContractButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; } else { NSLog( @"Cell Found - Row %d", indexPath.row ); } // Setup the cell ... </code></pre> <p>Log....</p> <pre><code>2012-03-24 11:44:02.158 Review Writer[13523:fb03] Number of rows 1 2012-03-24 11:44:02.172 Review Writer[13523:fb03] Cell Creation - Row 0 2012-03-24 11:44:02.192 Review Writer[13523:fb03] Row 0 - setting height 2012-03-24 11:44:02.197 Review Writer[13523:fb03] Cell Creation - Row 0 </code></pre> <p>Any pointers as to why this would be the case ?</p> <p>Code to populate the cell data</p> <pre><code>-(void)tableView:(UITableView *)tableView willDisplayCell:(CategoryCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"Setting up cell on Row %d - Expanded - %@", indexPath.row, cell.expanded ? @"YES" : @"NO"); [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; Category *cat = [categoryList objectAtIndex:indexPath.row]; cell.categoryLabel.text = cat.category; cell.ratingLabel.text = cat.overall_rating; if (cell.expanded == YES) { [cell expandCell]; } else { [cell collapseCell]; } cell.reviewText.text = cat.review_text; if([cat.overall_rating isEqualToString:@"Not Rated"]){ [cell.ratingImage setImage:[UIImage imageNamed: @"0_stars.png"]]; } if([cat.overall_rating isEqualToString:@"Unsatisfactory"]){ [cell.ratingImage setImage:[UIImage imageNamed: @"1_stars.png"]]; } if([cat.overall_rating isEqualToString:@"Needs improvement"]){ [cell.ratingImage setImage:[UIImage imageNamed: @"2_stars.png"]]; } if([cat.overall_rating isEqualToString:@"Meets job requirements"]){ [cell.ratingImage setImage:[UIImage imageNamed: @"3_stars.png"]]; } if([cat.overall_rating isEqualToString:@"Exceeds job requirements"]){ [cell.ratingImage setImage:[UIImage imageNamed: @"4_stars.png"]]; } if([cat.overall_rating isEqualToString:@"Outstanding"]){ [cell.ratingImage setImage:[UIImage imageNamed: @"5_stars.png"]]; } // Put the accessory disclosure button on the cell cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; } </code></pre> <p>Code to set the height of the cell...</p> <pre><code>- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { // Use the method that you would have created above to get the cell. CategoryCell *cell = (CategoryCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; NSString *text = cell.reviewText.text; // Note the 30 is a fudge factor... :-) Otherwise it does not include the last line... CGFloat width = [cell.reviewText frame].size.width - 30; CGFloat height = [text sizeWithFont:cell.reviewText.font constrainedToSize:CGSizeMake(width, 9999) lineBreakMode:UILineBreakModeWordWrap].height; NSLog( @"Row %d - setting height - Expanded = %@", indexPath.row, cell.expanded ? @"YES" : @"NO" ); if (cell.expanded == NO) { height = 0; } return height + 67; } </code></pre> <p>Code to expand / collapse the cell ...</p> <pre><code>- (IBAction) expandContractButtonPressed:(id) sender{ CategoryCell *clickedCell = (CategoryCell *)[[sender superview] superview]; NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell]; CategoryCell *cell = (CategoryCell*)[self tableView:self.tableView cellForRowAtIndexPath:clickedButtonPath]; NSLog( @"EXPAND / COLLAPSE Row %d Exanded = %@", clickedButtonPath.row, clickedCell.expanded ? @"YES" : @"NO"); if (clickedCell.expanded == YES) { NSLog( @"Collapse" ); [cell collapseCell]; clickedCell.expanded = NO; } else { NSLog( @"Expand" ); [cell expandCell]; clickedCell.expanded = YES; } NSLog( @"Expanded after = %@", clickedCell.expanded ? @"YES" : @"NO" ); NSArray *indexPaths = [[NSArray alloc] initWithObjects:clickedButtonPath, nil]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:NO]; } </code></pre>
 

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