2017-02-13 11 views
-1

Я использую пользовательский UICollectionView с пользовательским UICollectionViewCell:NumberOfItemsInSection вызывается перед CellForItemAt

class SelectTimeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, SliderDelegate { 

    @IBOutlet weak var collectionViewSlider: UICollectionView! 

    override func viewDidLoad() { 
     super.viewDidLoad()   

     collectionViewSlider?.register(DayCollectionViewCell.self, forCellWithReuseIdentifier: "cell") 

     collectionViewSlider.dataSource = self 
     collectionViewSlider.delegate = self 
    } 

    func numberOfSections(in collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 3 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     print("*\(indexPath.row)") 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! DayCollectionViewCell   
     cell.tag = indexPath.row   
     return cell 
    } 
} 

class DayCollectionViewCell: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate { 

    override init(frame: CGRect) { 
    super.init(frame: frame) 
    setupDayTimeline(width: frame.width, height: frame.height)   
} 

func setupDayTimeline(width: CGFloat, height: CGFloat) { 
    let appsCollectionView: UICollectionView = {    
     let collectionView = UICollectionView(frame: CGRect(x: 0, y: 30, width: width, height: height - 30), collectionViewLayout: layout) 
     return collectionView 
    }() 

    addSubview(appsCollectionView) 
    appsCollectionView.delegate = self 
    appsCollectionView.dataSource = self 
    appsCollectionView.register(UINib(nibName: "TimeCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "timecell") 
} 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     print(self.tag) 
     return myArray[self.tag].count 
    } 
} 

Но когда я прокручиваю свою UICollectionView и я получаю в консоли: * 0 * 1 * 2

Итак, для последней ячейки функция numberOfItemsInSection от DayCollectionViewCell называется earl y затем cellForItemAt от MyViewController. Как я могу решить эту проблему?

+0

Это не совсем понятно, какова ваша проблема. Кроме того, почему ваш класс ячейки также реализует 'UICollectionViewDataSource'? – Uncommon

+0

Я только что обновил свой код. Проблема: «cell.tag = indexPath.row» вызывается позже, тогда «return myArray [self.tag] .count» и self.tag равно 0 – Kirill

+0

Возможно, вы, вероятно, используете представление коллекции совершенно неправильно. 'CellForItem' будет вызываться всегда после' numberOfItemsInSection', потому что последний задает количество элементов, для которых нужно вызвать 'cellForItem'. PS: * Не используйте теги. * – Sulthan

ответ

1

Если я правильно понимаю, DayViewCollectionCell содержит другой вид коллекции, в котором ячейка установлена ​​в качестве источника данных своего коллекционного представления &. Поскольку это настроено в xib, он сразу же начинает получать запросы из представления коллекции, прежде чем вы сможете установить тег.

Я думаю, что решение состоит в том, чтобы не устанавливать источник данных в xib, а затем устанавливать его во время выполнения после установки тега ячейки. Или оставьте его установленным и добавьте обработчик didSet на номер cell.tag, где вы вызываете reloadData() в виде коллекции коллекции.

+0

Вложенные представления коллекции - это не то, что нужно сделать в первую очередь. – Sulthan

+0

Возможно, один или оба должны быть представлением стека. – Uncommon