(이 질문을 중복으로 표시하지 마십시오. 많은 질문을 읽었지만 문제의 답을 찾을 수 없습니다.)'UICollectionView는 non-nil 레이아웃 매개 변수로 초기화해야합니다.'- Swift 4
IUCollectionView
클래스와 UICollectionViewCell
클래스를 만들었습니다. 여기 컬렉션보기 하나입니다 그리고
class NearbyPlacesUICollectionView: UICollectionView {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
commonInit()
fatalError("init(coder:) has not been implemented")
}
override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
super.init(frame: frame, collectionViewLayout: layout)
commonInit()
}
init(collectionView: UICollectionView, frame: CGRect) {
let layout = UICollectionViewLayout()
super.init(frame: frame, collectionViewLayout: layout)
}
func commonInit() {
allowsMultipleSelection = false
backgroundColor = .white
let layout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
layout.itemSize = CGSize(width: UIScreen.main.bounds.width * 0.8875, height: 90*3)
frame = UIScreen.main.bounds
collectionViewLayout = layout
register(NearbyPlacesUICollectionView.self, forCellWithReuseIdentifier: "nearbyPlaceCell")
}
}
나는 내가 이것을 가지고 UIViewController
이 (나는 그것을 짧게 몇 가지 코드를 제거) 실행할 때
class NearbyPlacesViewController: UIViewController, UICollectionViewDataSource {
var collectionView = NearbyPlacesUICollectionView()
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
view.addSubview(collectionView)
}
}
extension NearbyPlacesViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 3
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 2
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: NearbyPlacesUICollectionViewCell? = collectionView.dequeueReusableCell(withReuseIdentifier: "nearbyPlaceCell", for: indexPath) as? NearbyPlacesUICollectionViewCell
return cell!
}
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if let cell = cell as? NearbyPlacesUICollectionViewCell
{
_configureCell(cell, atIndexPath: indexPath)
}
}
fileprivate func _configureCell(_ cell: NearbyPlacesUICollectionViewCell, atIndexPath indexPath: IndexPath)
{
cell.queue.cancelAllOperations()
let operation: BlockOperation = BlockOperation()
operation.addExecutionBlock { [weak operation]() -> Void in
DispatchQueue.main.sync(execute: { [weak operation]() -> Void in
if let operation = operation, operation.isCancelled {
return }
... // cell code here
})
}
cell.queue.addOperation(operation)
}
func collectionView(_ collectionView: UICollectionView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
view.backgroundColor = .clear
... // header code here
return view
}
}
을이 오류를 얻을 : UICollectionView must be initialized with a non-nil layout parameter
모든 init을 오버라이드하지만 호출되지 않은 것처럼 보입니다. 비슷한 문제에 관한 모든 질문을 읽었지만 어떤 대답도 찾지 못했습니다. (나는 스위프트 4를 사용하고있다). 죄송합니다. 코드를 많이 붙여도되지만 필요하다고 생각합니다. 귀하의 도움에 미리 감사드립니다.
var collectionView = NearbyPlacesUICollectionView()
이 더 레이아웃이 설정되어 있지 않은 잘못된 init
메소드를 호출 끝 :
그렇다면이 init 만 필요합니다. (프레임 : CGRect, collectionViewLayout 레이아웃 : UICollectionViewLayout). 그러나'commonInit()'호출을 삭제하면 레이아웃을 어디에 설정할 수 있습니까? 감사. –
모든 init를 시도했지만 아무도 작동하지 않습니다! –
하나의'init'을 사용한다면, 원하는 레이아웃을'init'에 넘깁니다. – rmaddy