UIImageView показывает изображение только после изменения вкладок в UITabBarViewController - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть UIScrollViewController, который имеет UIScrollView, который содержит UIImageView внутри. В loadView контроллера представления прокрутки я загружаю изображение, вызывая функцию, которая должна выполнять загрузку в другом потоке. Я вызываю эту функцию из своего loadView, а затем помещаю viewview в scrollview и устанавливаю scrollview как представление контроллера.

Проблема в том, что я не вижу изображение, когда запускаю программу после щелчка по строке в табличном представлении (которое должно выдвигать представление прокрутки с изображением в нем). Однако, если я изменю tabss (в tabbarviewcontroller) и вернусь к этой вкладке. Изображение покажет.

Так что я думаю, что загрузка изображения происходит, но у меня почему-то возникает проблема с отображением его на экране. Это появляется только после того, как я вернусь к нему. Что я делаю не так? Я новичок в темах, поэтому я подозреваю, что это проблема с этим. Кроме того, мой код работал до того, как я его сделал, чтобы он мог выполнять загрузку в другом потоке, поэтому я почти уверен, что это связано с этим.

Это функция в Photo.m, которая является сущностью в базовых данных. Это должно сделать загрузку

- (void)processImageDataWithBlock:(void (^)(NSData *imageData))processImage { 
    NSString *url = self.imageURL;
dispatch_queue_t callerQueue = dispatch_get_current_queue();   
dispatch_queue_t downloadQueue = dispatch_queue_create("Flickr download", NULL); 
dispatch_async(downloadQueue, ^{
    NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:url];

    dispatch_async(callerQueue, ^{

        processImage(imageData);   

    });

});

}

Это мой метод loadView в PhotoScrollViewController.m

- (void)loadView {

    [image processImageDataWithBlock:^(NSData *imageData) {

        UIImage *imageToBeShown = [UIImage imageWithData:imageData];        


        imageView = [[UIImageView alloc] initWithImage:imageToBeShown];
        CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
        scrollView = [[UIScrollView alloc] initWithFrame:applicationFrame];
        scrollView.delegate = self;
        scrollView.contentSize = imageToBeShown.size;

        [scrollView addSubview:imageView];
        self.title = image.title;
        self.view = scrollView;
    }];
      }

Отредактировано для добавления дополнительной информации, добавленной в качестве ответа

Добавление [super loadView] в мой метод loadView решило проблему. Однако в документации сказано, что я не должен вызывать super loadView из моего loadView.

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

Это потому, что загрузка каким-то образом мешает мне настроить представление в loadView?

1 Ответ

0 голосов
/ 09 апреля 2011

Кажется, что loadView завершает работу до загрузки изображения.Вам нужно каким-то образом вызвать [imageView setNeedsDisplay], когда загрузка изображения будет завершена.Вам нужен метод, который вызывается при завершении загрузки изображения, который обращается к imageView (возможно, используя viewWithTag) из scrollView и вызывает [imageView setNeedsDisplay];

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