UIImageView仅在更改UITabBarViewController中的选项卡后显示图像

时间:2011-04-09 12:24:20

标签: iphone uiimageview

我有一个UIScrollViewController,它有一个UIScrollView,里面有一个UIImageView。 在滚动视图控制器的loadView中,我通过调用一个函数来下载图像,该函数应该在另一个线程上进行下载。我从loadView中调用此函数,然后将imageview放在scrollview中,并将scrollview设置为控制器的视图。

问题是我在运行程序时看不到图像,单击tableView中的一行(它应该按下滚动视图中的图像)。但是,如果我更改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);   

    });

});

}

这是我在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中设置视图吗?

1 个答案:

答案 0 :(得分:0)

在图像下载完成之前,似乎loadView已完成。图像下载完成后,您需要一些调用[imageView setNeedsDisplay]的方法。您需要一些在完成图像下载时调用的方法,该方法从scrollView访问imageView(可能使用viewWithTag)并调用[imageView setNeedsDisplay];