UITableViewCell accessoryView не появляется намного позже - PullRequest
0 голосов
/ 07 июня 2009

У меня есть UITableView с несколькими записями. После выбора мне нужно, чтобы он выполнял сетевую работу, требующую много времени. Чтобы дать пользователю некоторую обратную связь, я попытался поместить UIActivityIndicatorView в UITableViewCell. Однако, блесна появляется не намного позже - после того, как я проделал дорогую операцию! Что я делаю не так?

- (NSIndexPath *) tableView:(UITableView *) tableView
   willSelectRowAtIndexPath:(NSIndexPath *) indexPath {

  UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]
                                       initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

  [spinner autorelease];
  [spinner startAnimating];
  [[tableView cellForRowAtIndexPath:indexPath] setAccessoryView:activity];

  if ([self lengthyNetworkRequest] == nil) {
    // ...

    return nil;
  }

  return indexPath;
}

Как вы можете видеть, у меня есть спиннер, установленный на accessoryView до длительной работы в сети. Но он появляется только после завершения метода tableView:willSelectRowAtIndexPath:.

Ответы [ 3 ]

2 голосов
/ 25 августа 2009

Как только вы сообщаете ActivityIndicator о начале анимации, вы должны дать циклу выполнения своего приложения возможность запустить анимацию перед началом длинной операции. Это может быть достигнуто путем перемещения дорогостоящего кода в собственный метод и вызова:

[self performSelector:@selector(longOperation) withObject:nil afterDelay:0];
1 голос
/ 07 июня 2009

РЕДАКТИРОВАТЬ: Я думаю, что вы должны использовать didSelect вместо willSelect.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Попробуйте добавить [CATransaction flush] прямо перед

if ([self lengthyNetworkRequest] == nil) {
0 голосов
/ 07 июня 2009
- (NSIndexPath *) tableView:(UITableView *) tableView
   willSelectRowAtIndexPath:(NSIndexPath *) indexPath {

  UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]
                                       initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

  [spinner autorelease];
  [spinner startAnimating];
  [[tableView cellForRowAtIndexPath:indexPath] setAccessoryView:activity];

  if ([self lengthyNetworkRequest] == nil) {

    //doing the intensive work after a delay so the UI gets updated first

    [self performSelector:@selector(methodThatTakesALongTime) withObject:nil afterDelay:0.25];

    //you could also choose "performSelectorInBackground"


  }

  return indexPath;
}


- (void)methodthatTakesALongTime{

    //do intensive work here, pass in indexpath if needed to update the spinner again

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...