簡體   English   中英

UIImageView僅在更改UITabBarViewController中的選項卡后才顯示圖像

[英]UIImageView showing the image only after changing tabs in the UITabBarViewController

我有一個UIScrollViewController,它具有一個UIScrollView,其中包含一個UIImageView。 在滾動視圖控制器的loadView中,我通過調用一個函數來下載圖像,該函數應該在另一個線程上進行下載。 我從loadView調用此函數,然后將imageview放在scrollview內,並將scrollview設置為控制器的視圖。

問題是,在運行程序時,在tableView中單擊一行后,我看不到該圖像(應該將其中包含圖像的scrollview推入其中)。 但是,如果我更改了選項卡(在tabbarviewcontroller中)並返回到此選項卡。 圖像將顯示。

因此,我認為圖像下載發生了,但是以某種方式在屏幕上立即顯示它卻有問題。 它僅在我回到它之后出現。 我似乎在做什么錯? 我是線程的新手,所以我懷疑這是一個問題。 同樣,我的代碼在我實現之前就已經工作了,以便可以在另一個線程中進行下載,因此我很確定它與此相關。

這是Photo.m中的功能,它是Core Data中的一個實體。 這應該做下載

- (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);   

    });

});

}

這是我在PhotoScrollViewController.m中的loadView方法

- (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方法中可以解決此問題。 但是,文檔說我不應該從我的loadView調用super loadView。

我嘗試將代碼移至viewDidLoad,效果也很好。 但這確實是設置視圖的代碼,因此我覺得應該將其放入loadView中。 但是,當我使用這種多線程機制進行下載時,它不起作用。

這是因為下載會以某種方式干擾我在loadView中設置視圖嗎?

似乎loadView在映像下載完成之前已完成。 圖像下載完成后,您需要某種方式調用[imageView setNeedsDisplay]。 您需要一種在完成圖像下載后會調用的方法,該方法可從scrollView訪問imageView(也許使用viewWithTag)並調用[imageView setNeedsDisplay]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM