2017-01-13 4 views
0

Попытка решить эту проблему по-разному. Текущая реализация дает мне ошибку: «NSInvalidArgumentException», причина: «нет объекта с индексом 3 в разделе с индексом 0» Это происходит в классе AppDelegate: UIResponder ...Добавить кнопку «Добавить новую» в последней ячейке UICollectionCell. (CoreData)

Мой код

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionCell 
    configureCell(cell: cell, indexPath: indexPath) 

    var numberOfItems = self.collectionView(self.collectionView, numberOfItemsInSection: 0) 

    if (indexPath.row == numberOfItems - 1) { 

     var addCellButton = UIButton(frame: cell.frame) 
     addCellButton.setTitle("Add", for: UIControlState.normal) 
     cell.addSubview(addCellButton) 
    } 
    return cell 
} 

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

    if let sections = controller.sections { 
     let sectionInfo = sections[section] 
     return sectionInfo.numberOfObjects + 1 
    } 
    return 0 
} 

func numberOfSections(in collectionView: UICollectionView) -> Int { 
    if let sections = controller.sections { 
     return sections.count 
    } 
    return 0 
} 

Любые советы?

+0

От вашего кода, похоже, ваш CollectionView имеет несколько разделов, и каждый раздел имеет кнопку добавления в конце. Правильно ли это предположение? Или только в одной из разделов есть кнопка добавления? – Zhang

+0

@ Чжан только один раздел. Добавить кнопку в конце одной секции. –

ответ

2

Вы можете написать это, чтобы из очереди две отдельные клетки:

import UIKit 

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 

    var collectionView:UICollectionView! 
    var items = ["Apple", "Banana", "Orange", "Watermelon", "Coconut"] 


    ... 

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

     // ------------------------------------------ 
     // +1 here for the extra add button 
     // at the bottom of the collection view 
     // ------------------------------------------ 
     return items.count + 1 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     // -------------------------------- 
     // IndexPath row vs Items Count 
     // -------------------------------- 
     // [0] = Apple 
     // [1] = Banana 
     // [2] = Orange 
     // [3] = Watermelon 
     // [4] = Coconut 
     // 
     // [5] = special cell 
     // 
     // --------------------------------- 
     let cellID = indexPath.row < items.count ? "normalCell" : "specialCell" 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) 

     setupCell(cell: cell, indexPath: indexPath, type: cellID) 

     return cell 
    } 

    func setupCell(cell: UICollectionViewCell, indexPath: IndexPath, type: String) { 
     switch(type) { 
     case "normalCell": 
      setupFruitCell(cell: cell as! FruitCell, indexPath: indexPath) 
     case "specialCell": 
      setupSpecialCell(cell: cell as! SpecialCell, indexPath: indexPath) 
     default: 
      break 
     } 
    } 

    func setupFruitCell(cell: FruitCell, indexPath: IndexPath) { 
     cell.label.text = items[indexPath.row] 
    } 

    func setupSpecialCell(cell: SpecialCell, indexPath: IndexPath) { 
     cell.btnAdd.addTarget(self, action: #selector(addButtonTapped), for: UIControlEvents.touchUpInside) 
    } 

    func addButtonTapped(sender: UIButton) { 
     print("Show UI to add new fruit") 
    } 
} 
+0

Я попытался создать два идентификатора ячейки. Ошибка сохраняется. Есть ли способ исследовать эту ошибку больше? Есть ли у вас какие-либо предложения? –

+0

переписал мой код, чтобы подчиниться вашей логике, реализовал различные методы «configureCell». По-прежнему была та же ошибка: нет объекта с индексом 3 в разделе по индексу 0. –

+0

Что вы видите, когда распечатываете свой источник данных? Например, в моем вышеприведенном коде я бы добавил 'print (" Items = \ (items) ")' над моим 'return items.count + 1', чтобы распечатать то, что было на самом деле в массиве. В любом случае ошибка, которую вы видите, говорит вам, что ваш источник данных не имеет 4-го элемента (индекс 3), и вы пытаетесь получить доступ к этому несуществующему элементу, следовательно, к ошибке. – Zhang

1

Не связывайтесь со своими ячейками, добавляя к ним вид. Ячейки перерабатываются, когда они уходят с экрана (вот почему его называют dequeueReusableCell). Если вы не удаляете дополнительный просмотр при подготовке к повторному использованию, они остаются в камере и снова добавляются снова. Вместо этого у вас есть еще 2 варианта:

1) Создайте вторую коллекциюViewCell в построителе интерфейса со своим собственным классом и повторным использованиемIdentifier и сверните экземпляр этой ячейки только для последней ячейки.

2) Сделать кнопку часть зрения колонтитула и вернуть его в viewForSupplementaryElementOfKind

+0

Пытается деактивировать 2 разных ячейки в cellForItemAt :. Как бы вы предложили структурировать оператор «If» для таргетинга на всю ячейку, кроме последней, а затем на последнюю? –

+0

Рассчитанное количество элементов в разделе с "numberOfItems (inSection :)" Задать условие: if indexPath.item <= numberOfItems - 1 По-прежнему имела ту же ошибку «нет объекта с индексом 3 в разделе с индексом 0». К сожалению, переход к созданию «Добавить» btn в другом месте. –