访问UIPageViewController中已创建的视图控制器

时间:2014-02-22 22:28:40

标签: ios cocoa-touch uipageviewcontroller

我正在使用UIPageViewController来显示图片,我会异步下载图像并在图片准备就绪时将它们放入图库中(但您仍然可以转到图库中的页面)图像成为。)

我的问题是,当图像 加载时,我需要为它对应的视图控制器提供它。现在,我将它添加到NSCache实例,当调用UIPageViewController的数据源方法viewControllerAfterViewController:时,我检查是否已经下载了所请求的视图控制器的图像(在缓存中)如果是,我在特定视图控制器上调用initWithImage:,传递下载的图像。

我的问题在于调用viewControllerAfterViewController:时图像尚未尚未下载。现在我只加载没有图像的视图控制器,当调用imageDidFinishDownloading:委托方法时,我尝试为视图控制器提供图像。

然而,似乎即使UIPageViewController要求下一个视图控制器显示上一个(即:当我到达第3页时,它请求第4页的视图控制器)我是无法访问我提交的请求的视图控制器

如果我访问pageViewController.viewControllers,则NSArray的计数从不超过1.所以即使它看起来应该有2(当前显示的视图控制器)以及它所要求的下一个,它只有一个,当前可见的视图控制器。

问题是我需要另一个。图像完成下载,我真的只有两个选项。

  1. 将它提供给我的NSCache,所以当为视图控制器调用init方法时,它会被移交。
  2. 如果init,请将其移至已经init编辑的视图控制器。
  3. 但是1并不总是有效,因为有时当没有图像(它还没有完成下载)时调用init方法,所以我们有时依赖于2,但是{{1} }只保存当前可见的视图控制器。

    所以基本上第三种情况是视图控制器已经pageViewController.viewControllers没有图像,图像完成下载,我想将它分配给那个视图控制器,但我现在正在那个在它之前,我对init中视图控制器的唯一引用是当前可见的。

    我该如何处理3?我需要为视图控制器分配一些内容,但我找不到任何方法来访问该视图控制器

2 个答案:

答案 0 :(得分:0)

我会使用来自PMConcurrency的未来来做这件事。未来只是一个承诺在图像可用时立即返回的对象。因此,通过将未来赋予视图控制器而不是图像,您无需担心图像何时到达。

您的视图控制器的初始化程序看起来像这样:

- initWithImageFuture:(PMFuture *)future
{
    if (self = [super init]) {
        [[future onMainThread] onComplete:^(id result, NSError *error) {
            if (!error) {
                _image = result;
            }
        }];
    }
    return self;
}

通过向未来添加onComplete块,视图控制器将在可用时立即接收图像(如果图像已下载,则立即接收)。默认情况下,期货在后台运行,因此您可以使用onMainThread在主线程上返回结果。

因此,不是用图像填充缓存,而是用图像期货填充它。有几种方法可以创建期货,但基于块的方法非常简单:

PMFuture *imageFuture = [PMFuture futureWithBlock:^id{
    UIImage *image = ...; // Your image fetching code here
    return image;        
}];

[myCache setObject:imageFuture forKey:myImageKey];

答案 1 :(得分:0)

我有类似的功能,但我在显示图像的视图控制器中加载图像(VC传递给UIPageViewController)。在你的上下文中,我想我已经有了VC的图像ID信息和NSCache对象。当然,这不是你想要做的,而只是要考虑的事情。

最初我试图像你一样处理父母的图像加载。我记得,我保留了一个指向目标视图控制器的弱指针。当图像到达时,如果VC还活着,我可以设置UIImageView属性。