问题
如图所示,我有一个容器视图(B),它位于视图内部,其上有其他控件(A)。容器视图(B)包含一个集合视图,我想在视图(A)上按下按钮时更新它。
我经历了UICollectionView Basics,但我觉得我必须遗漏一些东西。想要在UIViewControllers之间进行通信时,我的自然反应是基于回调或其他委托机制来构建一些东西。在重新发明轮子之前,有什么想法吗?
目前,当我单击视图中的按钮时,我的集合数据会更新,我会在集合视图上调用setNeedsDisplay和reloadData(通过childViewControllers属性访问)。我也试过在容器视图本身上调用setNeedsDisplay(没有快乐)。
顺便说一句 - 我已经审查了类似的SO问题,这些问题没有提供匹配的用例,但似乎表明对这一特定类型的问题缺乏洞察力(如果我错过了一个很好的答案,请告诉我) :
解决方案
请注意,我已经在下面分享了我的解决方案,但仍然欢迎其他答案(特别是如果这是更好的方式)
答案 0 :(得分:2)
<强>解决方案强>
由于我对社区的搜索显示了关于此主题的边缘信息,因此我正在分享我的解决方案。我在我的数据控制器上添加了一个回调函数。然后仔细检查How to tell UICollectionView about your content,我意识到我可以简单地切换数据源,如下所示(所以我做了两者的组合):
请注意有关如何让UICollectionView自行更新的多个选项。
<强>详情
在我的数据控制器的.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];
};
最终结果: