как отобразить индикатор - PullRequest
0 голосов
/ 15 ноября 2009

Я не могу отобразить вид индикатора.

ItemController.h

#import <UIKit/UIKit.h>


@interface ItemController : UITableViewController {
  UIView* loadingView;
  UIActivityIndicatorView* indicator;
}

@property (nonatomic, retain) UIView *loadingView;
@property (nonatomic, retain) UIActivityIndicatorView *indicator;

@end

ItemController.m

.....
- (void)netAccessStart {


  loadingView = [[UIView alloc] initWithFrame:[[self view] bounds]];
  [loadingView setBackgroundColor:[UIColor blackColor]];
  [loadingView setAlpha:0.5];
  indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  [[self view] addSubview:loadingView];
  [loadingView addSubview:indicator];
  [indicator setFrame:CGRectMake ((320/2)-20, (480/2)-60, 40, 40)];
  [indicator startAnimating];

}

- (void)netAccessEnd {


  [indicator stopAnimating];
  [loadingView removeFromSuperview];

}

- (void)dealloc {
  [loadingView release];
  [indicator release];
    [super dealloc];
}
.....

унаследованный класс

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  [self netAccessStart];
  sleep(1);
  [self netAccessEnd];
}

Ответы [ 2 ]

1 голос
/ 15 ноября 2009

sleep() блокирует выполнение, что означает, что ваше приложение зависает при вызове -viewWillAppear, в конце которого ваше loadingView удаляется из его суперпредставления. Другими словами, между [self netAccessStart]; и [self netAccessEnd]; не происходит рисование. Я предполагаю, что вы вызываете один сразу за другим для тестирования - в этом случае я бы переместил команду -netAccessStart на -viewDidAppear: и заменил вызов sleep / -netAccessEnd следующим:

[self performSelector:@selector(netAccessEnd) withObject:nil afterDelay:1];

... который будет иметь тот же эффект, но без блокировки выполнения.

0 голосов
/ 15 ноября 2009

Это потому, что вы используете sleep вместо того, чтобы что-то делать. Предположительно, вы хотите получить что-то из Интернета; сделайте это и отправьте себе это сообщение netAccessEnd только тогда, когда соединение завершится или прервется.

Замена sleep другой формой задержки, в которой все еще используется жестко заданный интервал (например, 1 секунда), - плохая идея. Если это занимает менее 1 секунды, вы заставляете пользователя ждать дольше, чем необходимо. Если это занимает более 1 секунды, вы снимаете индикатор, прежде чем фактически закончите с тем, что ожидает пользователь.

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

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