我在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;
}
我的手机没有显示视图任何想法为什么?
答案 0 :(得分:4)
通过使用队列来保存和重用一定数量的实例,我能够获得包含每个子视图控制器的单元集合的平滑滚动性能。
GitHub列出了许多重用队列实现;并且,在对几乎每一个人进行相当彻底的审查之后,我可以自信地推荐这个:
https://github.com/acoomans/ACReuseQueue
根据自述文件: 当对象分配和初始化耗时时,重用队列是一种快速重用对象的方法。
您的视图未显示的原因是您没有从单元子类中实例化子视图控制器,也没有从cellForItemAtIndexPath中添加视图。这是关于范围的,你已经倒退了。
此处提供了向子单元添加子视图控制器的完整说明:
答案 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