How to set an UIActivityIndicatorView when loading a UITableViewCell

77,356

Solution 1

You can add UIActivityIndicatorView as cell's 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];
}

Solution 2

In viewDidLoad of tableview B class, add an activity indicator.

// 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()

Now call your method that downloads data from the network.

myDownloadMethod()

Do it in a different thread if you don't want the UI to be non responsive during the process.

read this thread for that. Can I use a background thread to parse data?

When you are notified that the contents are downloaded, stop the indicator.

activityIndicator.stopAnimating()

Now you can call tableview.reloadData() for reloading the table to display the new contents.

Solution 3

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
}

Solution 4

It's work well for me, you can try it:

Call [activityIndicator startAnimating] when didHighlightRowAtIndexPath, and call [activityIndicator stopAnimating] when didUnhighlightRowAtIndexPath useful than 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];
}

Solution 5

This code below will display a spinner at the footer of the table view if more data is available on the server. You can change it according to your logic of fetching data from server.

- (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;
}
Share:
77,356
Wu Linsen
Author by

Wu Linsen

Updated on October 08, 2020

Comments

  • Wu Linsen
    Wu Linsen over 3 years

    I have two UITableViewControllers, A and B. When I tap one cell in table A, I will use UINavigationController to push table view controller B. But the data of B is downloaded from Internet, which takes several seconds. So I want to add a UIActivityIndicatorView when loading B. How can I achieve this?