этот код с использованием UIActivityIndicatorView имеет недостатки? - PullRequest
0 голосов
/ 08 июня 2011

Является ли этот код, использующий UIActivityIndicatorView, некорректным? Похоже, что на самом деле я вообще не вижу индикатор / счетчик, так что это потому, что представление не рисуется до тех пор, пока не завершится who viewDidLoad?

Является ли единственный способ обойти эту задачу - выполнить пользовательскую работу viewDidLoad (например, обновление данных) в отдельном потоке? (В этом случае я надеялся на более простую однопоточную операцию). Есть ли способ принудительно обновить представление после строки «startAnimating», возможно, до начала загрузки данных?

Код из реализации UITableViewController:

- (void)viewDidLoad {
    // Wait indicator - Start
    self.waitView = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] autorelease];
    self.waitView.hidesWhenStopped = true;
    [self.view addSubview: self.waitView];

    // Load data into tableview
    [NSThread sleepForTimeInterval: 5.0];   // Test code to simulate

    [self.waitView stopAnimating];
}

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Вы также должны вызвать startAnimating.Спать не очень хорошая идея.Я бы предпочел performSelector -методы, которые запускают неповторяющийся NSTimer под капотом.

Попробуйте это:

-(void) doStuff:(id)aSender
{
    [self.waitView stopAnimating];
}
-(void)viewDidLoad
{
    ...
    [self performSelector:@selector(doStuff:) withObject:self afterDelay:5.0];
}

в добавлении: также установите свойство frame- или bounds:ActivityIndicatorView где-то, как sosborn сказал в своем комментарии

1 голос
/ 08 июня 2011

На самом деле ответ Томаса должен работать как есть, я добавлю небольшое объяснение, почему бы не использовать сон, как вы это сделали.

Вся обработка пользовательского интерфейса на iPhone (и на большинстве ОС) выполняется только в одном потоке - главном потоке, который выполняет так называемый цикл выполнения. Если вы остановите этот поток, пользовательский интерфейс остановится, ничто не будет отображено.

Помещение sleep в viewDidLoad, который запускается в основном потоке, сделает именно это - остановит пользовательский интерфейс от каких-либо действий. Поэтому, поскольку сразу после пробуждения вы позвонили [self.waitView stopAnimating], и представление активности должно скрываться, когда не выполняется анимация, вы вообще его не видите - вы просто не дали ему времени показать.

Томас использовал NSTimer для вызова stopAnimating через 5 секунд - теперь это позволяет основному потоку выполнить код перед остановкой анимации и скрытием waitView, и это будет работать для вашего теста.

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

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

...