UICollectionView: must be initialized with a non-nil layout parameter

后端 未结 7 2173
不思量自难忘°
不思量自难忘° 2020-11-27 05:25

I added UICollectionView by code.
Now, the app crash with message: UICollectionView must be initialized with a non-nil layout parameter.
Do

相关标签:
7条回答
  • 2020-11-27 06:07

    Just a swift version of Riley Avron's answer

        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")
    
    0 讨论(0)
  • 2020-11-27 06:09

    The crash is telling you pretty explicitly what is going wrong:

    UICollectionView must be initialized with a non-nil layout parameter.

    If you check the documentation for UICollectionView, you'll find that the only initializer is initWithFrame:collectionViewLayout:. Further, in the parameters for that initializer, you'll see:

    frame

    The frame rectangle for the collection view, measured in points. The origin of the frame is relative to the superview in which you plan to add it. This frame is passed to the superclass during initialization.

    layout

    The layout object to use for organizing items. The collection view stores a strong reference to the specified object. Must not be nil.

    I've bolded the important part. You must use initWithFrame:collectionViewLayout: to initialize your UICollectionView, and you must pass it a non-nil UICollectionViewLayout object.


    One way to fix this, then, would be to simply change the order of initialization you do:

    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"];
    

    Note that in the above example, I've assumed you want to use self.view.frame as the frame of self.collectionView. If that's not the case, insert whatever frame you want instead.

    0 讨论(0)
  • 2020-11-27 06:14

    Swift 3.0 and Swift 4.0

    UICollectionView

    The app crashed as soon as it launched when UICollectionView is initialised

    initialize like below (above viewDidLoad)

    let alarmCollectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
    let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
    

    In Method (inside viewDidLoad)

    layout.scrollDirection = UICollectionViewScrollDirection.vertical
    alarmCollectionView.setCollectionViewLayout(layout, animated: true)
    alarmCollectionView.delegate = self
    alarmCollectionView.dataSource = self
    alarmCollectionView.backgroundColor = UIColor.clear
    self.addSubview(alarmCollectionView)
    

    Worked fine after initialising like this I am using Autolayout so using CGRect.zero or use your own CGRect

    UICollectionViewController

    In case if you are using UICollectionViewController instead of UICollectionView you need to add layout when initialization

     let  testNavController:UINavigationController = UINavigationController.init()
     let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init() 
     let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout )              
     testNavController.pushViewController(collectionView, animated: true)
    
    0 讨论(0)
  • 2020-11-27 06:18

    Swift 3.0, Swift 4.0 and Swift 5.0

    It's work for me.

    let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
    

    In Method (inside viewDidLoad)

    if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        flowLayout.scrollDirection = .horizontal
    }
    
    0 讨论(0)
  • 2020-11-27 06:18

    In Swift

    var collectionView: UICollectionView!
    let layout = UICollectionViewFlowLayout()
    collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    layout.scrollDirection = .vertical
    view.addSubview(collectionView)
    
    0 讨论(0)
  • 2020-11-27 06:25

    don't setCollectionViewLayout liked this:

    [self.collectionView setCollectionViewLayout:flowLayout];
    

    try to set when init:

    [[UICollectionView alloc] initWithFrame:frame collectionViewLayout:defaultLayout];
    
    0 讨论(0)
提交回复
热议问题