2009-07-21 8 views
0

J'ai une sous-classe UIView personnalisée que j'essaie d'utiliser comme en-tête pour une de mes sections groupées de vue de table. J'enregistre une instance de cette vue dans tableViewController et l'utilise pour retourner la hauteur de la section d'en-tête ainsi que la vue elle-même. le problème est qu'en quelque sorte cette variable d'instance passe d'un UIView à un CALayer au milieu d'un appel reloadData qui provoque un crash, puisque l'instance a une méthode spéciale pour retourner sa hauteur attendue. ceci est le code qui se bloque:Les vues d'en-tête de section UITableView personnalisées se brisent

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    if (section == 0) 
    { 
     return [self.dataHeader frameHeight]; 
    } 
    return 0.0f; 
} 
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    if (section == 0) 
    {  
     return self.dataHeader; 
    } 
    return nil; 
} 

je définir un point d'arrêt sur le premier retour dans le bloc si la méthode de heightForHeaderInSection, et il frappe 4 fois; les trois premiers retournent le dataHeader avec succès, tandis que la quatrième fois montre qu'il s'agit d'une CALayer et se bloque avec une exception doesNotRecognizeSelector (ma vue de table a deux sections si cela fait une différence). Y a-t-il une raison pour que cela se produise, et y a-t-il un moyen de l'arrêter?

Répondre

2

À quoi ressemble votre code d'initialisation pour dataHeader? Lorsque vous initialisez dataHeader, le retenez-vous correctement?

Ma conjecture est que votre vue de dataHeader est libérée avant que vous vouliez.

+0

Vous avez raison; c'était un problème. En fait, j'avais laissé une autorelease là d'un refactor. Je vais l'essayer demain quand j'aurai l'occasion de voir si ça le répare :). – Kevlar

0

Le problème semble être que vous avez 2 sections et en quelque sorte l'application pense qu'il ya 4. Voici comment je déboguer ce problème:

1) Qu'est-ce que numberOfSectionsInTableView retour (est-il mis en œuvre)?

Je suppose que chaque méthode d'en-tête doit être appelée n fois, où n est le nombre de sections dans votre table. Je suppose également que l'application demande au délégué susmentionné ce que n est.

2) Quelles sont les valeurs de section chaque fois que ces délégués sont appelés?

Il ne devrait y avoir qu'un appel par section, à moins que quelque chose ne me manque, et je serais étonné si le délégué est appelé plus d'une fois avec la même valeur de section.

Questions connexes