ios - 在 UIPageViewController 中访问已经创建的 View Controller

标签 ios cocoa-touch uipageviewcontroller

我正在使用 UIPageViewController用于显示图像,我异步下载图像并在它们准备好后将它们放入画廊(但您仍然可以转到图像所在的画廊页面)。

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

我的问题是什么时候 viewControllerAfterViewController:被调用,图像还没有被下载。现在我只加载没有图像的 View Controller ,当 imageDidFinishDownloading:委托(delegate)方法被调用时,我尝试为 View Controller 提供图像。

然而,似乎即使UIPageViewController要求显示前一个 View Controller 的下一个 View Controller (即:当我到达第 3 页时,它请求第 4 页的 View Controller )我无法访问我移交的这个请求的 View Controller .

如果我访问 pageViewController.viewControllers , NSArray 的计数从不 超过 1。因此,即使它看起来应该有 2 个(当前显示的 View Controller 和它请求的下一个),但它只有一个,即当前可见的 View Controller 。

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

  1. 给我的NSCache ,所以当 View Controller 的 init 方法被调用时,它被移交。
  2. 如果它已经init ed,将它交给已经是 init 的 View Controller 编辑。

但 1 并不总是有效,有时 init当还没有图像时调用方法(它还没有完成下载),所以我们有时会依赖 2,但是 pageViewController.viewControllers只持有当前可见的 View Controller 。

所以基本上存在第三种情况,其中 View Controller 已经是init。 ed 没有图像,图像完成下载,我想将它分配给那个 View Controller ,但我目前在它之前,我唯一引用 UIPageViewController 中的 View Controller 。在当前可见的那个上。

我如何处理 3?我需要为 View Controller 分配一些内容但我找不到任何方法来访问该 View Controller

最佳答案

我会使用来自 PMConcurrency 的类似 future 的东西去做这个。 Future 只是一个 promise 在图像可用时立即返回图像的对象。因此,通过将 future 交给您的 View Controller 而不是图像,您无需担心图像何时到达。

你的 View Controller 的初始化器看起来像这样:

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

通过为 future 添加一个 onComplete block , View Controller 将在图像可用时立即接收图像(如果图像已经下载则立即接收)。 Futures 默认在后台运行,因此您可以使用 onMainThread 在主线程上返回结果。

因此,不是用图像填充缓存,而是用图像 futures 填充它。有多种创建 future 的方法,但基于区 block 的方法非常简单:

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

[myCache setObject:imageFuture forKey:myImageKey];

关于ios - 在 UIPageViewController 中访问已经创建的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21961471/

相关文章:

ios - iphone可以拍红眼照片吗

ios - 弹出到 Root View Controller 时导航栏不会更新

ios - 在 UIPageViewController 内的 ViewController 内的 ScrollView 中检测 ScrollOffset?

arrays - 选择数组中的中间值 - Swift

ios - 为什么 [[NSError alloc] init];在 Xcode 中抛出错误?

ios - 当用户向下滑动两次触摸时如何防止 UITableView 中的 ScrollView ?

objective-c - UITableView 层上的内部阴影?

iphone - 进入后台时关闭应用程序

ios - UIPageViewController 与不同的 ViewControllers,正确的方式?

ios - 从 JSON 中获取字典的值