UITableView en-tête de section et de la section de pied de page mise à jour (problème de retraçage)

Mise à JOUR 4.0

Semble iOS 4.0 changé quelque chose ici. Même code produisant incorrect horizons pour la section d'en-tête dans le scénario décrit est de travailler avec 4.0 selon ma première vérification rapide!

Original

J'ai un UITableView regroupés style personnalisé en-tête et pied de page. À l'intérieur du pied de page j'ai mis un UILabel et un UIButton.

Cliquant sur le bouton permet de masquer ou d'afficher certaines lignes, les mises à jour de la UILabel dans le pied de page vue et enfin redimensionne le pied de page vue.

Fondamentalement, tout fonctionne bien. MAIS le texte ion de l'étiquette n'est pas mis à jour sur l'écran. Il est mis à jour dans le UILabel texte de propriété, mais seulement si j'ai faites défiler jusqu'à la section de pied de page de la zone visible et le faire défiler en arrière, il est mis à jour. Donc, c'est typique d'un problème de retraçage ici de la UITableView.

J'ai essayé toutes les méthodes pour forcer la mise à jour comme needsLayout etc. Rien n'a aidé.

J'ai vu des questions connexes, mais avec quelques différences de comportement et pas de solution. Toute aide/idées?

Merci, Gerd

Mise à JOUR:

Mes problèmes se produit avec la section de pied de page, voici donc mon viewForFooterInSection.

Fondamentalement, je veux réduire/développer une section, mais pas complètement (qui a été une chose facile) au lieu de seulement la cellule vide (ItemSize vide). Le footerView est grande si elle est réduite et diminuera si elle est développée. En outre, le texte de l'étiquette change.

- (UIView *)tableView: (UITableView *)tableView viewForFooterInSection: (NSInteger)section{
NSLog(@"viewForFooterInSection section:%i", section);
UIButton *myView;
UILabel *label;
if ([[[self.sectionStatus objectAtIndex:section] valueForKey:@"collapseStatus"] isEqual:@"collapse"]){ 
myView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 320, 52)];
[myView setBackgroundImage:[UIImage imageNamed:@"ItemViewFooter.png"] forState:UIControlStateNormal];
label = [[UILabel alloc] initWithFrame:CGRectMake(20, 32, 300, 20)];
label.text = NSLocalizedString(@"list_expand",@"");
} else { //is expanded
myView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 320, 21)];
[myView setBackgroundImage:[UIImage imageNamed:@"ListCollapseExpand.png"] forState:UIControlStateNormal];
label = [[UILabel alloc] initWithFrame:CGRectMake(20, 1, 300, 20)];
label.text = NSLocalizedString(@"list_collapse",@"");
}
myView.tag=section;
[myView addTarget:self action:@selector(collapseExpandAction:) forControlEvents:UIControlEventTouchUpInside];
myView.backgroundColor = [UIColor clearColor];
myView.adjustsImageWhenHighlighted = NO;
myView.showsTouchWhenHighlighted = YES;
label.textColor = FONTCOLOR;
label.font = [UIFont systemFontOfSize:14];
label.numberOfLines = 1;
label.textAlignment = UITextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
[myView addSubview:label];
return myView;

};

Dans le bouton d'action de la méthode que j'magasin d'état de la section de développer/réduire et le nombre de lignes affichées. Que j'ai supprimer ou insérer des lignes. (Il a d'être avec insert/delete parce que j'ai besoin de l'animation).

- (void) collapseExpandSection: (NSInteger) section{
NSMutableArray *paths = [NSMutableArray arrayWithCapacity:10];
NSInteger row;
NSInteger numberOfDisplayedItems=[[[self.sectionStatus objectAtIndex:section] valueForKey:@"numberOfDisplayedRows"] intValue];
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
NSInteger numberOfAllItems=[sectionInfo numberOfObjects];
Item *tmpItem=nil;
NSSet *itemsWithSizes=nil;
//filter not used cells
for ( row = 0; row < numberOfAllItems; row++ ) {
tmpItem=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"itemSize != nil"];
NSSet *itemsWithSizes = [tmpItem.itemSizes filteredSetUsingPredicate:predicate];
if ([itemsWithSizes count]==0){ 
[paths addObject:[NSIndexPath indexPathForRow:row inSection:section]]; //all unused cells
};
}
if (numberOfDisplayedItems == numberOfAllItems){ //currently all shown => Collapse
[self.tableView beginUpdates];
[[self.sectionStatus objectAtIndex:section] setValue:[NSNumber numberWithInt:(numberOfDisplayedItems-[paths count])] forKey:@"numberOfDisplayedRows"];
[[self.sectionStatus objectAtIndex:section] setValue:@"collapse" forKey:@"collapseStatus"];
[self.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
} else { //Not all shown so expand with the unused cells
[[self.sectionStatus objectAtIndex:section] setValue:[NSNumber numberWithInt:(numberOfDisplayedItems+[paths count])] forKey:@"numberOfDisplayedRows"];
[[self.sectionStatus objectAtIndex:section] setValue:@"expand" forKey:@"collapseStatus"];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
return;

};

Faire tout cela fonctionne bien en général. Après les blocs begin/endupdate la viewForFooter est appelée pour chaque section et le texte de l'étiquette est définie correcte dans la propriété. Mais l'affichage n'est pas mis à jour correctement. Dès qu'un réafficher forcée (srolling hors de défilement dans) l'affichage est OK.

InformationsquelleAutor Gerd | 2010-04-26