2017-10-08 4 views
0

(이 질문을 중복으로 표시하지 마십시오. 많은 질문을 읽었지만 문제의 답을 찾을 수 없습니다.)'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 메소드를 호출 끝 :

답변

0

문제는이 라인입니다. NearbyPlacesUICollectionView 클래스에 3 개의 init 메소드를 정의했습니다. 두 가지 중 하나를 사용하여 레이아웃을 설정하십시오.

그리고이 init 방법 :

init(collectionView: UICollectionView, frame: CGRect) 

는 이해되지 않는다. 그것은해야한다 :

init(frame: CGRect) 

당신이 collectionView 속성을 사용하지 않는 (확실히 필요가 없습니다) 때문이다.

override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) 

호출하여 다시 생성하고 레이아웃을 설정 commonInit :

그것은이 init는 것도 이상한. 그러나 이미 레이아웃을 init에 전달 된 레이아웃으로 설정했습니다.

+0

그렇다면이 init 만 필요합니다. (프레임 : CGRect, collectionViewLayout 레이아웃 : UICollectionViewLayout). 그러나'commonInit()'호출을 삭제하면 레이아웃을 어디에 설정할 수 있습니까? 감사. –

+0

모든 init를 시도했지만 아무도 작동하지 않습니다! –

+0

하나의'init'을 사용한다면, 원하는 레이아웃을'init'에 넘깁니다. – rmaddy