UIProgressView не отображается на UITableViewCell - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть прототип ячейки на раскадровке iOS, который включает UIProgressView.

Фоновый процесс, который периодически выполняется, уведомляет делегата о том, что он запущен.Этот делегат должен сделать UIProgressView видимым в ячейке таблицы, но этого не происходит.Хотя я вижу, что вызываемый делегат не вызывает появления UIProgressView.

Метод делегата пытается получить указатель на UIProgressView следующим образом:

  UIProgressView* view = (UIProgressView*) [[[self tableView:myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]] contentView] viewWithTag:MyProgressViewTag];

Где viewWithTag установлен на тег UIProgressView.

Я пытался вызвать [myTableView reloadData] и [myTableView setNeedsDisplay], чтобы попытаться вызвать перерисовку ячейки, но это не сработало.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

вы запрашиваете новую ячейку из источника данных tableView, полученная ячейка не является частью tableView.

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

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

UIProgressView* view = (UIProgressView*) [[[myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]] contentView] viewWithTag:MyProgressViewTag];

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

1 голос
/ 23 февраля 2012

просто предположение, но если ваш фоновый процесс выполняется на чем-то отличном от основного потока, пользовательский интерфейс не будет обновляться. Все вызовы UIKit должны быть сделаны в главном потоке. Что вы можете сделать, это использовать Grand Central Dispatch (GCD) и отправить блок в основную очередь. то есть в фоновом процессе, где вам нужно обновить UIProgressView.

dispatch_async(dispatch_get_main_queue(),^{
      // your background processes call to the delegate method
});

В этом проекте показано, как обновить UIProgressView из фонового процесса с использованием GCD: https://github.com/toolmanGitHub/BDHoverViewController

Вот еще один пример:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0),^{
        NSInteger iCntr=0;
        for (iCntr=0; iCntr<1000000000; iCntr++) {
            if ((iCntr % 1000)==0) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [blockSelf.hoverViewController updateHoverViewStatus:[NSString stringWithFormat:@"Value:  %f",iCntr/1000000000.0]
                                                           progressValue:(float)iCntr/1000000000.0];
                });
            }

        }

Удачи.

Тим

1 голос
/ 23 февраля 2012

Попробуйте:

[myTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil];

Все действия интерфейса должны выполняться в главном потоке.

Надеюсь, это поможет.

...