Подтвердить что ты не робот

Как установить UIActivityIndicatorView при загрузке UITableViewCell

У меня есть два UITableViewController s, A и B. Когда я нажимаю одну ячейку в таблице A, я буду использовать UINavigationController для вызова контроллера табличного представления B. Но данные B загружаются из Интернета, что занимает несколько секунд. Поэтому я хочу добавить UIActivityIndicatorView при загрузке B. Как я могу это достичь?

4b9b3361

Ответ 1

Вы можете добавить UIActivityIndicatorView в качестве ячейки 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];
}

Ответ 2

В viewDidLoad класса tableview B добавьте индикатор активности.

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

Теперь вызовите ваш метод, который загружает данные из сети.

myDownloadMethod()

Сделайте это в другом потоке, если вы не хотите, чтобы пользовательский интерфейс не реагировал во время процесса.

прочитайте эту тему. Можно ли использовать фоновый поток для анализа данных?

Когда вы будете уведомлены о том, что содержимое загружено, остановите индикатор.

activityIndicator.stopAnimating()

Теперь вы можете вызвать tableview.reloadData() для перезагрузки таблицы, чтобы отобразить новое содержимое.

Ответ 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
}

Ответ 4

Это хорошо работает для меня, вы можете попробовать это:

Позвоните [activityIndicator startAnimating], когда didHighlightRowAtIndexPath, и звоните [activityIndicator stopAnimating], когда didUnhighlightRowAtIndexPath полезнее, чем 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];
}

Ответ 5

Приведенный ниже код будет отображать счетчик в нижнем колонтитуле табличного представления, если на сервере доступно больше данных. Вы можете изменить его в соответствии со своей логикой получения данных с сервера.

- (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;
}