1. ホーム
  2. ios

[解決済み] UICollectionView: 非Nilのレイアウトパラメータで初期化する必要があります。

2022-02-07 12:40:02

質問

を追加しました。 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;
}

解決方法は?

クラッシュは、何が問題なのかを明確に教えてくれているのです。

<ブロッククオート

UICollectionViewは、非Nilのレイアウトパラメータで初期化する必要があります。

を確認すると のドキュメントを参照してください。 UICollectionView であることがわかります。 initWithFrame:collectionViewLayout: . さらに、そのイニシャライザーのパラメーターの中に、こうあります。

フレーム

コレクションビューのフレーム矩形で、単位はポイントです。フレームの原点は、それを追加する予定のスーパービューからの相対的なものです。このフレームは、初期化中にスーパークラスに渡されます。

レイアウト

項目を整理するために使用するレイアウトオブジェクト。コレクションビューは、指定されたオブジェクトへの強い参照を保存します。 nilであってはならない。

私は 太字 重要な部分です。を使用する必要があります。 initWithFrame:collectionViewLayout: を初期化するために UICollectionView を渡す必要があり、また、非Nilの UICollectionViewLayout オブジェクトを作成します。


では、これを解決する一つの方法は、単純に初期化の順番を変えることです。

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

なお、上記の例では、「1. self.view.frame のフレームとして使用します。 self.collectionView . そうでない場合は、代わりに好きなフレームを挿入してください。