it-roy-ru.com

UICollectionView: должен быть инициализирован с параметром макета не-ноль

Я добавил UICollectionView по коду.
Теперь происходит сбой приложения с сообщением: UICollectionView must be initialized with a non-nil layout parameter.
У тебя есть идея, чтобы это исправить?
CollectionCell - это пользовательский класс UICollectionViewCell.

@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;
}
48
kusumoto_teruya

Авария довольно ясно говорит вам, что происходит не так:

UICollectionView должен быть инициализирован с параметром компоновки, отличным от nil.

Если вы проверите документацию для UICollectionView , вы обнаружите, что единственным инициализатором является initWithFrame:collectionViewLayout:. Далее, в параметрах этого инициализатора вы увидите:

Рамка

Прямоугольник рамки для представления коллекции, измеренный в точках. Происхождение кадра связано с суперпредставлением, в которое вы планируете добавить его. Этот кадр передается суперклассу во время инициализации.

layout

Объект макета, используемый для организации элементов. Представление коллекции хранит строгую ссылку на указанный объект. Не должно быть ноль.

Я выделил важную часть. Вы должны использовать initWithFrame:collectionViewLayout: для инициализации UICollectionView, и вы должны передать ему объект не UICollectionViewLayout, отличный от nil. 


Таким образом, один из способов исправить это - просто изменить порядок инициализации, который вы делаете:

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. Если это не так, вставьте любой кадр, который хотите.

64
ravron

Swift 3.0 и Swift 4.0

UICollectionView

Приложение рухнуло сразу после запуска при инициализации UICollectionView

инициализировать какниже (выше viewDidLoad)

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

In Method (внутри viewDidLoad)

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, вам нужно добавить макет при инициализации

 let  testNavController:UINavigationController = UINavigationController.init()
 let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init() 
 let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout )              
 testNavController.pushViewController(collectionView, animated: true)
26
Koushik

Просто Свифт версия Райли Аврон ответ

    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")
17
William Hu

not setCollectionViewLayout понравилось это: [self.collectionView setCollectionViewLayout: flowLayout]; попытаться установить, когда init: [[UICollectionView alloc] initWithFrame: кадр collectionViewLayout: defaultLayout];

0
Semyon