2 votes

Comment accéder à un UIActivityIndicatorView dans l'en-tête de section d'un UITableView ?

Je veux faire quelque chose d'assez simple avec mon UITableView : Je veux ajouter un UIActivityIndicatorView à l'en-tête d'une section, et le faire s'animer ou disparaître quand je le souhaite.

Je n'ai eu aucun problème à ajouter l'UIActivityIndicatorView à la vue de l'en-tête en utilisant tableView:viewForHeaderInSection :

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 60.0)];

// create the title
UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 12.0, 310.0, 22.0)];
headerLabel.text = @"some random title here";

[customView addSubview:headerLabel];
[headerLabel release];

// Add a UIActivityIndicatorView in section 1
if(section == 1)
{
    [activityIndicator startAnimating];
    [customView addSubview:activityIndicator];
}

return [customView autorelease];

}

activityIndicator est une propriété de la classe de mon contrôleur. Je l'alloue dans la méthode viewDidLoad :

- (void)viewDidLoad 
{ 
(...)
activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(200, 10, 25, 25)];
}

De cette façon, je peux lui envoyer des messages (comme -startAnimating ou -stopAnimating) quand je le souhaite. Le problème est que l'indicateur d'activité disparaît dès que je fais défiler la tableView (je suppose que c'est parce que la méthode tableView:viewForHeaderInSection : est appelée une seconde fois).

Comment puis-je ajouter un activityIndicatorView à l'en-tête de la section et être en mesure de lui envoyer des messages par la suite ? (sans que l'indicateur d'activité ne disparaisse lorsque je fais défiler la page vers le bas, bien entendu)

Merci beaucoup !

1voto

prajakta Points 352

L'indicateur d'activité est-il un IBoutlet ? ??? En fait, je ne peux même pas faire glisser l'indicateur d'activité dans ma vue de table.

0voto

Nimrod Points 4472

Si vous essayez d'utiliser le même indicateur d'activité à plusieurs endroits, il est probable qu'il soit déplacé d'un endroit à l'autre. Je pense que vous avez besoin d'un indicateur différent pour chaque en-tête de section. Vous pourriez utiliser un MutableArray pour garder une trace des vues d'en-tête que vous créez afin de pouvoir les réutiliser si vous en trouvez une dans le tableau qui n'a pas de vue d'ensemble, un peu comme si vous mettiez en file d'attente et réutilisiez des cellules.

Ce n'est qu'une supposition car je n'ai pas fait cela, mais je suis presque sûr que le problème vient du fait que l'on essaie de réutiliser la même vue à plusieurs endroits.

0voto

John Points 41

Le problème semble être dû à la recréation d'une vue personnalisée et à l'ajout de l'indicateur d'activité en tant que vue secondaire à chaque fois que tableView:viewForHeaderInSection : est appelé.

Le fait de ne pas utiliser de vues secondaires m'a aidé à résoudre le problème :

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

// Add a UIActivityIndicatorView in section 1
if(section == 1)
{
    [activityIndicator startAnimating];
    return activityIndicator;
}

    UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 60.0)];

// create the title
UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 12.0, 310.0, 22.0)];
headerLabel.text = @"some random title here";

[customView addSubview:headerLabel];
[headerLabel release];

return [customView autorelease];
}

(c'est assez laid cependant, l'indicateur d'activité prend toute la largeur de la section. Je ferais mieux de créer une customView unique pour la section 1 et d'ajouter l'indicateur d'activité en tant que sous-vue une fois pour toutes).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X