J'ai deux UITableViewController
, A et B. Lorsque j'appuie sur une cellule du tableau A, j'utilise UINavigationController
pour pousser le contrôleur de vue de table B. Mais les données de B sont téléchargées à partir d'Internet, qui prend plusieurs secondes. Je veux donc ajouter un UIActivityIndicatorView
lors du chargement de B. Comment puis-je y parvenir?
Vous pouvez ajouter IActivityIndicatorView comme cellule accessoryView.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.frame = CGRectMake(0, 0, 24, 24);
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryView = spinner;
[spinner startAnimating];
[spinner release];
}
Dans viewDidLoad de la classe tableview B, ajoutez un indicateur d'activité.
// Create the Activity Indicator.
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
activityIndicator.hidesWhenStopped = true
view.addSubview(activityIndicator)
// Position it at the center of the ViewController.
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor),
activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor)])
activityIndicator.startAnimating()
Appelez maintenant votre méthode qui télécharge les données du réseau.
myDownloadMethod()
Faites-le dans un thread différent si vous ne voulez pas que l'interface utilisateur ne réponde pas pendant le processus.
lire ce fil pour ça. Puis-je utiliser un fil d'arrière-plan pour analyser les données?
Lorsque vous êtes informé que le contenu est téléchargé, arrêtez l'indicateur.
activityIndicator.stopAnimating()
Vous pouvez maintenant appeler tableview.reloadData()
pour recharger la table pour afficher le nouveau contenu.
UIActivityIndicatorView * activityindicator1 = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(150, 200, 30, 30)];
[activityindicator1 setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityindicator1 setColor:[UIColor orangeColor]];
[self.view addSubview:activityindicator1];
[activityindicator1 startAnimating];
[self performSelector:@selector(callfunction) withObject:activityindicator1 afterDelay:1.0];
-(void)callfunction
{
// Here your stuf
}
Cela fonctionne bien pour moi, vous pouvez l'essayer:
[activityIndicator startAnimating] when didHighlightRowAtIndexPath, [activityIndicator stopAnimating] when didUnhighlightRowAtIndexPath utile que didSelectRowAtIndexPath.
- (void)runIndicatorAtIndexPath:(NSIndexPath *)indexPath display:(BOOL)playing{
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.accessoryView = activityIndicator;
playing == YES ?[activityIndicator startAnimating]:[activityIndicator stopAnimating];
}
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
[self runIndicatorAtIndexPath:indexPath display:YES];
}
- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath{
[self runIndicatorAtIndexPath:indexPath display:NO];
}
Ce code ci-dessous affichera un spinner au bas de la vue de table si plus de données sont disponibles sur le serveur. Vous pouvez le modifier en fonction de votre logique de récupération des données du serveur.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
/* set cell attributes here */
NSInteger lastSectionIndex = [tableView numberOfSections] - 1;
NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1;
if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) {
if(isMoreDataAvailableOnserver)
{
[self showSpinnerAtFooter];
[self getMoreDataFromServer];
}
else
{
[self hideSpinnerAtFooter];
}
}
return cell;
}
-(void) hideSpinnerAtFooter {
self.tableView.tableFooterView =nil;
}
-(void) showSpinnerAtFooter {
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[spinner startAnimating];
spinner.frame = CGRectMake(0, 0, 320, 44);
self.tableView.tableFooterView = spinner;
}