У меня есть класс PhotoViewController
с классом @property UIActivityIndicatorView* spinner
. FlickrPhotoViewController
— это подкласс PhotoViewController
, который загружает фото с Flickr и сообщает счетчику, когда начинать и останавливать анимацию. 'updatePhoto' вызывается каждый раз, когда контроллеру представления передается фотография Flickr:
- (void)updatePhoto { // Download photo and set it
NSLog("updatePhoto called");
if (self.spinner) NSLog(@"Spinner exists in updatePhoto");
dispatch_queue_t downloadQueue = dispatch_queue_create("downloader",
NULL);
[self.spinner startAnimating];
dispatch_async(downloadQueue, ^{
// Download the photo
dispatch_async(dispatch_get_main_queue(), ^{
[self.spinner stopAnimating];
// Set the photo in the UI
}
});
});
}
Вышеупомянутая методология — это именно то, что я использую для отображения вращающегося колеса в моих контроллерах табличного представления во время загрузки содержимого таблицы, и оно всегда работает там.
Вы заметите, что в начале updatePhoto
я печатаю сообщение, если UIActivityIndicatorView
существует. Я поместил аналогичное утверждение в awakeFromNib
, viewDidLoad
и viewWillAppear
. Когда я запускаю его, это точный результат, который я получаю:
2013-01-31 21:30:55.211 FlickrExplorer[1878:c07] updatePhoto called
2013-01-31 21:30:55.222 FlickrExplorer[1878:c07] Spinner exists in viewDidLoad
2013-01-31 21:30:55.223 FlickrExplorer[1878:c07] Spinner exists in viewWillAppear
Почему spinner
не существует в awakeFromNib
? Документы указывают, что «когда объект получает сообщение awakeFromNib, для него гарантированно уже установлены все его выходы и подключения к действиям». Можно ли подключить IBOutlet без существования объекта, к которому он подключается? В этом случае можно ли подключить spinner
IBOutlet к раскадровке без выделения spinner
?
Помимо этого, я переопределил геттер для spinner
, чтобы он создавал экземпляр, если он не существует. В результате вывод на печать теперь выглядит так:
2013-01-31 21:48:45.646 FlickrExplorer[2222:c07] Spinner exists in awakeFromNib
2013-01-31 21:48:45.647 FlickrExplorer[2222:c07] updatePhoto called
2013-01-31 21:48:45.647 FlickrExplorer[2222:c07] Spinner exists in updatePhoto
2013-01-31 21:48:45.649 FlickrExplorer[2222:c07] Spinner exists in viewDidLoad
2013-01-31 21:48:45.650 FlickrExplorer[2222:c07] Spinner exists in viewWillAppear
Это то, что я ожидал увидеть раньше. Тем не менее, я все еще не получаю никакой анимации.
Возможные проблемы, которые я исключил:
- спиннер имеет тот же цвет, что и фон, что делает его невидимым. В моем проекте фон черный, а счетчик белый.
- Я пытаюсь анимировать
UIActivityIndicatorView
, в то время как какой-то дорогостоящий метод блокирует основной поток . В моем проекте все методы ввода-вывода файловой системы и методы загрузки вызываются в неосновной очередиdispatch_async
. - IBOutlet счетчика не подключен. В моем проекте я неоднократно проверял это. Как из раскадровки, так и из файла PhotoViewController.h видно, что он подключен.
Все эти три возможности исключаются тем фактом, что добавление [self.spinner startAnimating];
в viewWillAppear
позволяет успешно анимировать его на протяжении всего процесса загрузки.
Вы можете загрузить этот проект, если хотите. Просто перейдите на любой экран, который пытается отобразить большую фотографию, и вы увидите, что счетчик не появляется. У этого проекта много проблем, но сейчас я сосредоточусь на этой.
Редактировать 1:
- Я добавил отсутствующие зависимости проекта от Git, поэтому теперь проект будет компилироваться для вас.
Редактировать 2 (2 февраля 2013 г.):
- Я вижу эту проблему только на iPhone, когда метод
updatePhoto
вызывается из-за того, чтоprepareForSegue
другого контроллера представления устанавливает фотографию в файлеFlickrPhotoViewController
. Возможно ли, что это способствует возникновению проблемы?
ActivityIndicator
проблем - person u.gen   schedule 31.01.2013stopAnimating
— хорошая идея, но проблема не в этом, поскольку вызовstartAnimating
изviewWillAppear
работает просто отлично, как указано в моем исходном посте. Кроме того, ссылка на исходный проект включена в мой исходный пост. - person Xander Dunn   schedule 01.02.2013UIView[Controller]
подклассов) и т. д. 2 Если приложение разработано с использованием IB, разработчик без IB ни за что не сможет над ним работать. 3. Это заставляет ленивых новичков избегать обучения кодированию пользовательского интерфейса. - person   schedule 02.02.2013