UICollectionView内部的UiviewControllers

时间:2015-05-21 14:11:11

标签: ios objective-c uiviewcontroller uicollectionview uicollectionviewcell

我在UIViewController中有一个UICollectionView。 collectionView包含来自故事板的8个视图控制器标识符的数组。 数组中的每个视图控制器都继承自保存collectionView的UIViewController。

以下是代码:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return _contentPageRestorationIDs.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

BaseContentViewController *contentViewController = (BaseContentViewController *)[self.storyboard instantiateViewControllerWithIdentifier:self.contentPageRestorationIDs[indexPath.row]];

// Set any data needed by the VC here
contentViewController.rootViewController = self;
contentViewController.view.frame = cell.bounds;
[cell addSubview:contentViewController.view];

return cell;
}

所以我的问题是我的收藏视图滑动性能非常慢。 如何改善UICollectionView的性能? 我的视图控制器是否被杀死了#34;什么时候不出现?

编辑:

在这里建议后,我已经将我的数组更改为持有视图控制器而不是标识符nsstring。

在ViewDidLoad中:

_collectionView.delegate=self;
_collectionView.dataSource=self;
PRzeroVC  *zeroVC    = [[PRzeroVC alloc]init];
PRoneVC   *oneVC     = [[PRoneVC alloc]init];
PRtwoVC   *twoVC     = [[PRtwoVC alloc]init];
PRthreeVC *threeVC   = [[PRthreeVC alloc]init];
PRfourVC  *fourVC    = [[PRfourVC alloc]init];
PRfiveVC  *fiveVC    = [[PRfiveVC alloc]init];

_base           = [[BaseContentViewController alloc]init];

_pages = [[NSArray alloc]initWithObjects:zeroVC,oneVC,twoVC,threeVC,fourVC,fiveVC, nil];

[_collectionView reloadData];



- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = (UICollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
_base = (BaseContentViewController *)_pages[indexPath.row];

_base.rootViewController = self;
_base.view.frame = cell.bounds;
[cell addSubview:_base.view];

return cell;
}

我的手机没有显示视图任何想法为什么?

3 个答案:

答案 0 :(得分:4)

通过使用队列来保存和重用一定数量的实例,我能够获得包含每个子视图控制器的单元集合的平滑滚动性能。

GitHub列出了许多重用队列实现;并且,在对几乎每一个人进行相当彻底的审查之后,我可以自信地推荐这个:

https://github.com/acoomans/ACReuseQueue

根据自述文件: 当对象分配和初始化耗时时,重用队列是一种快速重用对象的方法。

您的视图未显示的原因是您没有从单元子类中实例化子视图控制器,也没有从cellForItemAtIndexPath中添加视图。这是关于范围的,你已经倒退了。

此处提供了向子单元添加子视图控制器的完整说明:

http://khanlou.com/2015/04/view-controllers-in-cells/

答案 1 :(得分:2)

来自instantiateViewControllerWithIdentifier: -

的文档
  

每次调用时,此方法都会创建指定视图控制器的新实例

最好存储一个UIViewController数组,以便可以重复使用它们,而不是每次调用tableView:cellForItemAtIndexPath:时存储ID并实例化一个新的视图控制器。

此外,由于UICollectionViewCell被重复使用,因此每次调用tableView:cellForItemAtIndexPath:时都不会继续向细胞添加子视图。相反,请考虑使用mainView属性创建自己的UICollectionViewCell子类。在设置新的框架(或添加布局约束)并将其添加为子视图之前,您可以覆盖setMainView:以从其超级视图中删除旧的mainView。

此外,您应该实现适当UIViewController containment的方法。

答案 2 :(得分:0)

使用Swift更新(在collectionview的单元格中添加viewcontrollers)

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    let cellContentVC = self.storyboard?.instantiateViewController(withIdentifier: screens[indexPath.row])
    cellContentVC?.view.frame = cell.bounds
    cell.addSubview(cellContentVC!.view)

    return cell