容器视图内的UICollectionView - 单击按钮时刷新

时间:2014-04-03 14:46:29

标签: ios7 uicollectionview uicontainerview

问题

如图所示,我有一个容器视图(B),它位于视图内部,其上有其他控件(A)。容器视图(B)包含一个集合视图,我想在视图(A)上按下按钮时更新它。

我经历了UICollectionView Basics,但我觉得我必须遗漏一些东西。想要在UIViewControllers之间进行通信时,我的自然反应是基于回调或其他委托机制来构建一些东西。在重新发明轮子之前,有什么想法吗?

目前,当我单击视图中的按钮时,我的集合数据会更新,我会在集合视图上调用setNeedsDisplay和reloadData(通过childViewControllers属性访问)。我也试过在容器视图本身上调用setNeedsDisplay(没有快乐)。

顺便说一句 - 我已经审查了类似的SO问题,这些问题没有提供匹配的用例,但似乎表明对这一特定类型的问题缺乏洞察力(如果我错过了一个很好的答案,请告诉我) :

ABCD

DVC Analysis

解决方案

请注意,我已经在下面分享了我的解决方案,但仍然欢迎其他答案(特别是如果这是更好的方式)

1 个答案:

答案 0 :(得分:2)

<强>解决方案

由于我对社区的搜索显示了关于此主题的边缘信息,因此我正在分享我的解决方案。我在我的数据控制器上添加了一个回调函数。然后仔细检查How to tell UICollectionView about your content,我意识到我可以简单地切换数据源,如下所示(所以我做了两者的组合):

请注意有关如何让UICollectionView自行更新的多个选项。

UICollectionView Tip

<强>详情

在我的数据控制器的.h文件中

// @interface

上方
typedef void (^CallbackBlock)();

// @interface

@property (strong, nonatomic) CallbackBlock onDataUpdated;

//我的数据控制器方法中数据已更改

[DataManager sharedManager].onDataUpdated(); //singleton, i know...

//替代上面的单身人士

__weak DataManager* weakSelf = [[DataManager alloc]init];
weakSelf.onDataUpdated();

//在我的UIViewController(B)子类

@property (strong,nonatomic)DataManager* controller;

//在我的视图中加载了UIVC(B)

self.controller = [DataManager sharedManager];

__weak ProgressViewController* weakSelf = self;

self.controller.onDataUpdated = ^(){
    //perform my action
    [weakSelf setData:nil]; //remove existing data
    [weakSelf setData:[self getSomeData]]; //get some new data
    [[weakSelf progressCollectionView]reloadData]; 
    [[weakSelf progressCollectionView] setNeedsDisplay];
};

最终结果:

  1. UIVC(A)点击按钮
  2. Data Manager类在步骤1的方法执行结束时触发数据更新事件
  3. UIVC(B)立即重新加载数据而不刷新UIVC的其他子视图(A)