developer tip

UICollectionView : nil이 아닌 레이아웃 매개 변수로 초기화되어야합니다.

copycodes 2020. 12. 29. 07:21
반응형

UICollectionView : nil이 아닌 레이아웃 매개 변수로 초기화되어야합니다.


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

위의 예에서는 .NET Framework self.view.frame의 프레임으로 사용한다고 가정했습니다 self.collectionView. 그렇지 않은 경우 원하는 프레임을 삽입하십시오.


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)

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)

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")

In Swift

var collectionView: UICollectionView!
let layout = UICollectionViewFlowLayout()
collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
layout.scrollDirection = .vertical
view.addSubview(collectionView)

don't setCollectionViewLayout liked this:

[self.collectionView setCollectionViewLayout:flowLayout];

try to set when init:

[[UICollectionView alloc] initWithFrame:frame collectionViewLayout:defaultLayout];

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
}

ReferenceURL : https://stackoverflow.com/questions/24288927/uicollectionview-must-be-initialized-with-a-non-nil-layout-parameter

반응형