UICollectionViewController 与流布局崩溃
UICollectionViewController with Flow Layout Crash
我刚刚以编程方式创建了一个 UICollectionViewController
。到目前为止,一切都很好,但我遇到了一些问题。当调用 CollectionViewController 时,我的应用程序立即崩溃,并返回此错误。
'UICollectionView must be initialized with a non-nil layout parameter'
我当然尝试插入 UICollectionViewFlowLayout
,但它继续崩溃,我不明白为什么。有人可以向我解释如何在不使用故事板的情况下使用 UICollectionViewController
吗??
我哪里做错了?
@implementation ChooseRegion
static NSString * const reuseIdentifier = @"Cell";
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = NO;
// Register cell classes
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.itemSize = CGSizeMake(100, 100);
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
#pragma mark <UICollectionViewDataSource>
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
#warning Incomplete implementation, return the number of sections
return 0;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
#warning Incomplete implementation, return the number of items
return 0;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
// Configure the cell
return cell;
}
解决了我的问题...谢谢大家在这方面给我的很多提示和建议..你们太好了!!
出现所有这些问题是因为 UICollectionViewController
在呈现时未使用其布局进行初始化。
我使用[self presentViewController:collectionViewController animated:YES completion:nil]
方法从另一个UIViewController
调用UICollectionViewController
....此时问题出现了...
UICollectionViewController
仅分配用于显示,没有必要的布局显示...这就是该死的崩溃的原因!!!
于是我就这样解决了
UIViewController.m
-(void)presentCollectionViewController {
UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.itemSize = CGSizeMake (100, 100);
[layout setScrollDirection: UICollectionViewScrollDirectionHorizontal];
UICollectionViewController * chooseRegion = [[UICollectionViewController alloc] initWithCollectionViewLayout:layout];
[self presentViewController: chooseRegion animated: YES completion: nil];
}
UICollectionViewController.m
-(void)viewDidLoad {
[super viewDidLoad];
// Register cell classes
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
}
此时一切正常...
在 UICollectionViewController 中,您不需要在这种情况下指定任何类型的布局,因为它是在 class 的分配期间指定的,然后再显示
如果您正在使用(或子类化)UICollectionViewController
,它已经分配了一个 UICollectionView
实例。您不需要实例化或创建一个新的。我怀疑这不起作用的原因是你没有将新视图添加到层次结构中(即使你将它分配给 self.collectionView
.
而不是self.collectionView = [[UICollectionView alloc] init...
只需将布局分配给您现有的 UICollectionView
,例如:
self.collectionView.collectionViewLayout = layout
我刚刚以编程方式创建了一个 UICollectionViewController
。到目前为止,一切都很好,但我遇到了一些问题。当调用 CollectionViewController 时,我的应用程序立即崩溃,并返回此错误。
'UICollectionView must be initialized with a non-nil layout parameter'
我当然尝试插入 UICollectionViewFlowLayout
,但它继续崩溃,我不明白为什么。有人可以向我解释如何在不使用故事板的情况下使用 UICollectionViewController
吗??
我哪里做错了?
@implementation ChooseRegion
static NSString * const reuseIdentifier = @"Cell";
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = NO;
// Register cell classes
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.itemSize = CGSizeMake(100, 100);
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
#pragma mark <UICollectionViewDataSource>
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
#warning Incomplete implementation, return the number of sections
return 0;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
#warning Incomplete implementation, return the number of items
return 0;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
// Configure the cell
return cell;
}
解决了我的问题...谢谢大家在这方面给我的很多提示和建议..你们太好了!!
出现所有这些问题是因为 UICollectionViewController
在呈现时未使用其布局进行初始化。
我使用[self presentViewController:collectionViewController animated:YES completion:nil]
方法从另一个UIViewController
调用UICollectionViewController
....此时问题出现了...
UICollectionViewController
仅分配用于显示,没有必要的布局显示...这就是该死的崩溃的原因!!!
于是我就这样解决了
UIViewController.m
-(void)presentCollectionViewController {
UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.itemSize = CGSizeMake (100, 100);
[layout setScrollDirection: UICollectionViewScrollDirectionHorizontal];
UICollectionViewController * chooseRegion = [[UICollectionViewController alloc] initWithCollectionViewLayout:layout];
[self presentViewController: chooseRegion animated: YES completion: nil];
}
UICollectionViewController.m
-(void)viewDidLoad {
[super viewDidLoad];
// Register cell classes
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
}
此时一切正常...
在 UICollectionViewController 中,您不需要在这种情况下指定任何类型的布局,因为它是在 class 的分配期间指定的,然后再显示
如果您正在使用(或子类化)UICollectionViewController
,它已经分配了一个 UICollectionView
实例。您不需要实例化或创建一个新的。我怀疑这不起作用的原因是你没有将新视图添加到层次结构中(即使你将它分配给 self.collectionView
.
而不是self.collectionView = [[UICollectionView alloc] init...
只需将布局分配给您现有的 UICollectionView
,例如:
self.collectionView.collectionViewLayout = layout