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
'developer tip' 카테고리의 다른 글
nodejs의 배열에 항목을 추가하는 방법 (0) | 2020.12.29 |
---|---|
Font Awesome 아이콘을 가로로 가운데 맞추는 방법은 무엇입니까? (0) | 2020.12.29 |
다중 반응 열을 수행 할 때 행 지우기-부트 스트랩 (0) | 2020.12.29 |
Docker 복사 및 소유자 변경 (0) | 2020.12.29 |
프로그래밍 방식으로 툴바에 대한 app : layout_scrollFlags를 설정하는 방법 (0) | 2020.12.29 |