1

问题

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

我已经完成了UICollectionView 基础知识,但我觉得我一定遗漏了一些东西。当想要在 UIViewControllers 之间进行通信时,我的自然反应是开始并基于回调或其他委托机制构建一些东西。在我重新发明轮子之前,有什么想法吗?

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

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

DVC分析

解决方案

请注意,我已经在下面分享了我的解决方案,但仍然欢迎提供其他答案(尤其是如果它是更好的方法)

4

1 回答 1

2

解决方案

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

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

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];
};

最终结果:

  1. UIVC(A)接收按钮点击
  2. 数据管理器类在步骤 1 的方法执行结束时触发数据更新事件
  3. UIVC (B) 立即重新加载数据而不刷新 UIVC (A) 的其他子视图
于 2014-04-03T19:33:07.213 回答