Презентация в подвиде отложена - PullRequest
2 голосов
/ 13 января 2011

В моем подклассе UITableViewController я хочу подготовить табличные данные и перезагрузить таблицу после того, как представление уже появилось (поэтому таблица изначально загружается пустой).В моем приложении-делегате у меня есть методы для создания и удаления экрана активности.Кажется, моя проблема в том, что представление представления активности откладывается до тех пор, пока не будет выполнен вызов reloadData.Я доказал это, удалив строку hideActivity и, конечно же, мое представление активности появилось одновременно с перезагрузкой таблицы.Вот viewDidAppear для моего контроллера представления ...

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [(AppDelegate *)[[UIApplication sharedApplication] delegate] showActivity];
    [self prepare];
    [self.tableView reloadData];
    [(AppDelegate *)[[UIApplication sharedApplication] delegate] hideActivity];
}

Я предполагаю, что это может иметь отношение к представлениям, не перерисовывающим средний метод, но не помню, чтобы это происходило раньшеЕсть идеи?

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

- (void)showActivity
{
    self.activityView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)];
    self.activityView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.75f];

    UIActivityIndicatorView *spinner = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake((320.0f / 2.0f) - (37.0f / 2.0f), (480.0f / 2.0f) - (37.0f / 2.0f) - (20.0f / 2.0f), 37.0f, 37.0f)] autorelease];
    spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    [spinner startAnimating];   

    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0.0f, spinner.frame.origin.y + spinner.frame.size.height + 10.0f, 320.0f, 30.0f)] autorelease];
    label.textAlignment = UITextAlignmentCenter;
    label.text = @"Working";
    label.textColor = [UIColor whiteColor];
    label.backgroundColor = [UIColor clearColor];

    [self.activityView addSubview:label];
    [self.activityView addSubview:spinner];

    [self.window addSubview:self.activityView];
}

- (void)hideActivity
{
    [self.activityView removeFromSuperview];
    [self.activityView release];
}

1 Ответ

0 голосов
/ 13 января 2011

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

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [(AppDelegate *)[[UIApplication sharedApplication] delegate] showActivity];
  [self performSelector:@selector(prepareData) withObject:nil afterDelay:0.0];
}

- (void)prepareData {
  [self prepare];
  [self.tableView reloadData];
  [(AppDelegate *)[[UIApplication sharedApplication] delegate] hideActivity];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...