集合视图中的UIViewController

20

我的App中有一个全屏的UICollectionView。它可以水平滚动,每个单元格都填充了集合视图的边界。此集合视图由UIViewController管理。

鉴于每个“页面”都相当复杂,因此每个页面本身都由相关联的UIViewController管理是有意义的。iOS 5支持视图控制器容器,这样子控制器在附加和分离视图时应该会接收到适当的生命周期方法(例如viewWillAppear:等)。它与视图回收很好地配合吗?

从页面“1”滚动到页面“2”,将创建一个新的视图(因为在触摸开始时两个页面都可能同时出现在屏幕上)。从页面“2”移动到页面“3”,UICollectionView可以成功地为页面“1”出队视图,但现在会发生什么呢?我是否需要像这样强制将视图插入到第三个视图控制器中?

id cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ident" forIndexPath:indexPath];
UIViewController *child_controller = [self controllerAtIndexPath:indexPath];
[child_controller setView:cell];
// ... and so on

这感觉不对。但是,在这种情况下,我无法想出正确的重用视图的方法。我是不是完全错了?


8
如果每个单元格填满了集合视图的边界,为什么不使用UIPageViewController,并将其transitionStyle设置为UIPageViewControllerTransitionStyleScroll?它被设计用于每页托管一个子视图控制器。 - rob mayoff
3个回答

8
我认为在您的任务中,UICollectionView 不是最好的选择。
就像rob mayoff所说的那样:您可以使用 UIPageViewController
另一个选择是使用带有3个子视图(上一个,当前和下一个)的 UIScrollView。您将能够轻松管理其位置和滚动视图偏移量以实现您想要的效果。
这在 WWDC 2011 的“高级 ScrollView 技术”中有描述。您可以从那里获取源代码。

我完全同意Sergey的观点:这个任务正是UIPageViewController所创建的。 - MrTJ
@Sergey Kuryanov,我也遇到了同样的问题,但在UIPageViewController中遇到了内存问题,您能提供任何帮助来解决内存问题吗?我正在使用ARC。 - DAMM108
也许你正在尝试同时保存过多的VC。没有实际代码很难检测问题。 - Sergey Kuryanov

7
我做了同样的事情,但同时显示了两个可重排列的视图控制器,所以集合视图是正确的选择。
结果发现,删除前一个视图控制器的视图并添加新视图会导致滚动性能大幅下降,其中删除视图是最慢的方法。
仅当单元格的新用途类似但不同 - 例如更改标签的文本或将不同的图像放入图像视图时,才有意义地重用单元格。如果您正在撕下并替换整个视图层次结构,则实际上并没有重用单元格。
我最终使用每个可包含的视图控制器的新单元格。在我的情况下,存在单元格数量的限制,这意味着同时使用那么多视图控制器并没有真正的内存消耗问题。
简而言之-不要重用单元格。它比保留旧单元格更昂贵。向下滚动一百行表与横向滚动几个全屏视图不同。但是,考虑到您的视图是全屏的,滚动视图可能是更好的选择。

我现在也在做完全相同的事情(其他视图控制器的边缘可见,就像应用商店搜索结果一样)。你还遇到了什么其他问题或者有什么建议吗? - Bob Spryn
1
我发现有用的唯一一件事是让所有子视图控制器采用一个协议,该协议允许集合视图的控制器在它们移动到屏幕上和离开屏幕时告诉它们 - 在那里,您将执行viewDidAppear / disappear的操作,否则不会被调用,因为视图只出现一次。 - jrturton
你最终是使用分页来强制他们到下一项了吗?在 .pagingEnabledtargetContentOffsetForProposedContentOffset 之间做决定。 - Bob Spryn
2
客户想要“fling”滚动,所以我不能使用分页,不得不实现自己的捕捉。他们希望它感觉像分页,但具有滚动多个项目的能力。如果可以的话,请使用分页,这样会更简单。 - jrturton
看起来当你有多个可见时,你不能真正使用分页,因为你不想将整个框架进行分页。而且你也不能缩小框架并使用clipsToBounds=NO,因为集合视图会摆脱那些不在框架内的单元格。 - Bob Spryn
显示剩余4条评论

6

使用UIView子类(或UICollectionViewCell子类)比封装的UIViewControllers更好。封装的UIViewControllers必须了解它们的父视图控制器,这可能会导致代码可维护性方面的问题。

复杂性并不一定意味着您应该考虑采用UIViewController。UIViews也可以非常复杂。UIViewController的作用实际上是提供额外的封装和生命周期,但在这里似乎您不需要。

正如其他人所说,UIPageViewController似乎也是一个很好的替代选择,但我不知道您的具体情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接