Как остановить индикатор активности? - PullRequest
2 голосов
/ 30 января 2012

Как остановить UIActivityIndicatorView? Этот код не работает.

BubbleTableViewCell.h:

@interface BubbleTableViewCell : UITableViewCell {

    UIActivityIndicatorView *activity;
}

BubbleTableViewCell.m:

- (void)setActivity:(BOOL)value {

    if (value) {
        activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        activity.center = CGPointMake(15, 15);
        [activity startAnimating];
        [self.contentView addSubview:activity];
    }
    else {
        [activity stopAnimating];
        [activity removeFromSuperview];
        [activity release];
    }
}

Ответы [ 4 ]

0 голосов
/ 30 января 2012

Предположим, что вы хотите отобразить индикатор активности в UITableViewCell, когда некоторые данные (например, изображение) загружаются, и как только они загружаются, вы хотите остановить индикатор. Один из подходов к этому в методе tableView:cellForRowAtIndexPath::

  • Проверьте, доступны ли данные для загрузки (например, изображение) или нет.
  • Если данные доступны, вызовите метод setActivity: с NO в параметре.
  • Но если данные недоступны, вызовите метод setActivity: с YES в параметре и начните загрузку соответствующих данных.
  • После загрузки данных перезагрузите конкретную ячейку, используя
    - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
  • Теперь, когда вызывается tableView:cellForRowAtIndexPath:, будут загружены ваши данные для строки, и будет вызван метод setActivity: с параметром NO, который скроет индикатор (если он есть).

При таком подходе вам нужно немного изменить функцию, чтобы:

<code>
- (void)setActivity:(BOOL)value 
{
  if (value)
  {
    activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    activity.center = CGPointMake(15, 15);
    [activity startAnimating];
    [self.contentView addSubview:activity];
  }
  else
  {
    if(activity)
    {
      [activity stopAnimating];
      [activity removeFromSuperview];
      [activity release];
    }
  }
}
0 голосов
/ 30 января 2012

Просто отладьте статус значения в обоих случаях. Я думаю, что значение BOOL, установленное в true, не изменяется в false для выполнения другой части.

0 голосов
/ 30 января 2012

Вы установили активность дважды? Возможно, вы потеряете ссылку, если дважды вызовете эту функцию с одним и тем же значением BOOL

0 голосов
/ 30 января 2012

Я могу только предположить, где и зачем вам нужен индикатор активности, но если он вам нужен во время загрузки данных, вы можете сделать это:

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell * cell;
MyCustomCell * myCell = [TableViewCellsFactory loadCellFromNibWithName:@"myCell" identifier:@"myCell" tableView:aTableView owner:self];
if(dataIsLoading) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"loadingCell"] autorelease];
    UIActivityIndicatorView * activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [activityIndicator startAnimating];
    [activityIndicator setFrame:CGRectMake(140, 40, 40,  40)];
    [cell addSubview:activityIndicator];
}
else {
    //here you customize myCell
    cell = myCell;
}
return cell;

Это прекрасно работает для меня ....

...