Я создал пользовательский UITableViewCell, который я хочу динамически расширять и сжимать при нажатии кнопки в ячейке.Метод вызывается, когда кнопка нажата, но может показаться, что ячейка создается дважды ... Поэтому я сбрасываю состояние ... Я пролил это несколько дней, пробуя разные вещи, но затрудняюсь понять, чтонеправильно ...
- (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 ...
Журнал ....
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
Есть ли какие-либо указатели на то, почему это так?
Код для заполнения ячейкиdata
-(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;
}
Код для установки высоты ячейки ...
- (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;
}
Код для развертывания / свертывания ячейки ...
- (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];
}