首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UICollectionView:必须使用非零布局参数初始化

UICollectionView:必须使用非零布局参数初始化
EN

Stack Overflow用户
提问于 2014-06-18 15:01:29
回答 7查看 99K关注 0票数 86

我通过代码添加了UICollectionView

现在,应用程序崩溃的消息是:UICollectionView must be initialized with a non-nil layout parameter

你有办法修好它吗?

CollectionCellUICollectionViewCell的自定义类。

代码语言:javascript
运行
复制
@property (nonatomic, strong) UICollectionView* collectionView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.collectionView = [[UICollectionView alloc]init];
    [self.collectionView registerClass:[CollectionCell class] forCellWithReuseIdentifier:@"cell"];
    UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
    flowLayout.itemSize = CGSizeMake(100, 100);
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    [self.collectionView setCollectionViewLayout:flowLayout];

    self.collectionView.frame = CGRectMake(0, 60, 320, 500);
    self.collectionView.backgroundColor = [UIColor whiteColor];
    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;
    [self.view addSubview:self.eventCollection];
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 20;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CollectionCell* cell = [self.eventCollection dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.label.text = [NSString stringWithFormat:@"%d", indexPath.item];
    return cell;
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-06-18 15:45:30

坠机事件非常清楚地告诉你出了什么问题:

必须使用非零布局参数初始化UICollectionView。

如果您检查UICollectionView,您会发现唯一的初始化程序是initWithFrame:collectionViewLayout:。此外,在初始化器的参数中,您将看到:

框架 集合视图的框架矩形,以点数为单位。框架的起源相对于您计划在其中添加它的超级视图。此框架在初始化期间传递给超类。 布局 用于组织项的布局对象。集合视图存储对指定对象的强引用。绝不能是零。

用粗体表示了的重要部分。您必须使用initWithFrame:collectionViewLayout:来初始化您的UICollectionView,并且必须传递给它一个非零UICollectionViewLayout对象。

因此,解决这一问题的一种方法是简单地更改初始化的顺序:

代码语言:javascript
运行
复制
UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.itemSize = CGSizeMake(100, 100);
[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:flowLayout];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];

注意,在上面的示例中,我假设您希望使用self.view.frame作为self.collectionView的框架。如果不是这样的话,插入任何你想要的帧。

票数 90
EN

Stack Overflow用户

发布于 2016-12-01 04:40:36

SWIFT3.0和SWIFT4.0

UICollectionView

UICollectionView初始化时,应用程序一启动就崩溃了。

初始化如下(viewDidLoad上)

代码语言:javascript
运行
复制
let alarmCollectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()

方法(在viewDidLoad中)

代码语言:javascript
运行
复制
layout.scrollDirection = UICollectionViewScrollDirection.vertical
alarmCollectionView.setCollectionViewLayout(layout, animated: true)
alarmCollectionView.delegate = self
alarmCollectionView.dataSource = self
alarmCollectionView.backgroundColor = UIColor.clear
self.addSubview(alarmCollectionView)

像这样初始化后工作得很好,我使用的是Autolayout,所以使用CGRect.zero或者使用您自己的CGRect

UICollectionViewController

如果您使用的是UICollectionViewController而不是UICollectionView,则需要在初始化时添加布局。

代码语言:javascript
运行
复制
 let  testNavController:UINavigationController = UINavigationController.init()
 let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init() 
 let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout )              
 testNavController.pushViewController(collectionView, animated: true)
票数 49
EN

Stack Overflow用户

发布于 2016-02-14 11:00:07

这是Riley Avron的快速回答。

代码语言:javascript
运行
复制
    let layout = UICollectionViewFlowLayout()
    layout.itemSize = CGSizeMake(100, 100)
    let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
    self.view.addSubview(collectionView)
    collectionView.delegate   = self
    collectionView.dataSource = self
    collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellIdentifier")
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24288927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档