2016-03-03 3 views
0

Я прочитал еще несколько вопросов по этому поводу, связанную с размером CollectionView. Я попытался настроить размер, как рекомендовано в этих ответах, но никто из них не работал. Я использую NSFetchedResultsController, который тоже сверлит его для меня (мне интересно, не связано ли это с ним, а не стрелять).cellForItemAtIndexPath не вызывается, непонятно, почему

В любом случае, реальная проблема заключается в том, что у меня нет содержимого для моего UICollectionView. Во время выполнения нет ошибок, просто пустой экран. Я работаю в Swift (очевидно).

Вот мой код из ViewController:

import UIKit 
import CoreData 

private let reuseIdentifier = "Family" 
private var selectedFirstName:String = "Blank" 
private var selectedLastName:String = "Blank" 
private var selectedNumber:String = "Blank" 
private var selectedEmail:String = "Blank" 

class FamilyViewController: UIViewController, UICollectionViewDataSource { 

var coreDataStack: CoreDataStack! 
var fetchedResultsController: NSFetchedResultsController! 

@IBOutlet var familyCollectionView: UICollectionView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //1 
    let fetchRequest = NSFetchRequest(entityName: "Family") 

    let firstNameSort = 
    NSSortDescriptor(key: "firstName", ascending: true) 

    fetchRequest.sortDescriptors = [firstNameSort] 

    //2 
    self.coreDataStack = CoreDataStack() 
    fetchedResultsController = 
     NSFetchedResultsController(fetchRequest: fetchRequest, 
      managedObjectContext: coreDataStack.context, 
      sectionNameKeyPath: nil, 
      cacheName: nil) 

    fetchedResultsController.delegate = CollectionViewFetchedResultsControllerDelegate(collectionView: familyCollectionView) 

    //3 
    do { 
     try fetchedResultsController.performFetch() 
    } catch let error as NSError { 
     print("Error: \(error.localizedDescription)") 
    } 
} 


func configureCell(cell: FamilyCCell, indexPath: NSIndexPath) { let family = fetchedResultsController.objectAtIndexPath(indexPath) as! Family 

    cell.firstNameLabel.text = family.firstName 
    print("configureCell ran") 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    print("numberOfSectionsInCollectionView ran") 
    return fetchedResultsController.sections!.count 
} 


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of items 
    let sectionInfo = fetchedResultsController.sections![section] 
    print("numberOfItemsInSection ran") 
    return sectionInfo.numberOfObjects 
} 


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! FamilyCCell 

    print("cellForItemAtIndexPath ran") 
    configureCell(cell, indexPath: indexPath) 

    return cell 
} 




override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "showDetail") { 
     let detailVC = segue.destinationViewController as! ContactViewController 

     print("prepareForSegue ran") 
     detailVC.detailFirstName = selectedFirstName 
     detailVC.detailLastName = selectedLastName 
     detailVC.detailNumber = selectedNumber 
     detailVC.detailEmail = selectedEmail 
    } 
} 
} 

extension FamilyViewController: UICollectionViewDelegate { 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    print("didSelectItemAtIndexPath ran") 
    collectionView.delegate = self 

    let family = fetchedResultsController.objectAtIndexPath(indexPath) as! Family 

    selectedFirstName = family.firstName! 
    selectedLastName = family.lastName! 
    selectedNumber = family.phone! 
    selectedEmail = family.email! 
    coreDataStack.saveContext() 
} 
} 


class CollectionViewFetchedResultsControllerDelegate: NSObject, NSFetchedResultsControllerDelegate { 

// MARK: Properties 

private let collectionView: UICollectionView 
private var blockOperations: [NSBlockOperation] = [] 

// MARK: Init 

init(collectionView: UICollectionView) { 
    self.collectionView = collectionView 
} 

// MARK: Deinit 

deinit { 
    blockOperations.forEach { $0.cancel() } 
    blockOperations.removeAll(keepCapacity: false) 
} 

// MARK: NSFetchedResultsControllerDelegate 

func controllerWillChangeContent(controller: NSFetchedResultsController) { 
    blockOperations.removeAll(keepCapacity: false) 
} 

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 

    switch type { 

    case .Insert: 
     guard let newIndexPath = newIndexPath else { return } 
     let op = NSBlockOperation { [weak self] in self?.collectionView.insertItemsAtIndexPaths([newIndexPath]) } 
     blockOperations.append(op) 

    case .Update: 
     guard let newIndexPath = newIndexPath else { return } 
     let op = NSBlockOperation { [weak self] in self?.collectionView.reloadItemsAtIndexPaths([newIndexPath]) } 
     blockOperations.append(op) 

    case .Move: 
     guard let indexPath = indexPath else { return } 
     guard let newIndexPath = newIndexPath else { return } 
     let op = NSBlockOperation { [weak self] in self?.collectionView.moveItemAtIndexPath(indexPath, toIndexPath: newIndexPath) } 
     blockOperations.append(op) 

    case .Delete: 
     guard let indexPath = indexPath else { return } 
     let op = NSBlockOperation { [weak self] in self?.collectionView.deleteItemsAtIndexPaths([indexPath]) } 
     blockOperations.append(op) 

    } 
} 

func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) { 

    switch type { 

    case .Insert: 
     let op = NSBlockOperation { [weak self] in self?.collectionView.insertSections(NSIndexSet(index: sectionIndex)) } 
     blockOperations.append(op) 

    case .Update: 
     let op = NSBlockOperation { [weak self] in self?.collectionView.reloadSections(NSIndexSet(index: sectionIndex)) } 
     blockOperations.append(op) 

    case .Delete: 
     let op = NSBlockOperation { [weak self] in self?.collectionView.deleteSections(NSIndexSet(index: sectionIndex)) } 
     blockOperations.append(op) 

    default: break 

    } 
} 

func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    collectionView.performBatchUpdates({ 
     self.blockOperations.forEach { $0.start() } 
     }, completion: { finished in 
      self.blockOperations.removeAll(keepCapacity: false) 
    }) 
} 
} 

У меня есть операторы печати, подтверждающие, что cellForItemAtIndexPath не работает. Есть идеи? Я понимаю, что это довольно специфично, и я дал полный текст кода, просто не совсем уверен, откуда может произойти ошибка. Спасибо за любую помощь заранее.

+0

I Полагаю, что я это сделал. Я контролировал их в раскадровке и подключил collectionView к Datasource/Delegate. Что-нибудь с кодом viewcontroller мне нужно будет подключить? Я так не думал, но я определенно мог ошибиться. – skind

+2

Вы возвращаете ненулевое количество разделов и предметов? – Sulthan

+0

Я запрашиваю NSFetchedResultsController для подсчета секций, поэтому он должен возвращать ненулевой номер. – skind

ответ

1

Убедитесь, что ... вы подтверждаете методы протокола UICollectionViewDelegate.
набор collectionview.delegate = self
collectionview.datasource = self

+0

Хотя это, как правило, оно, оно не фиксирует этот код. Я уже подключил их. – skind

+0

Чтобы уточнить, кто читает это позже, я изменил свой код, чтобы не ссылаться на «CoreDataStack». Вместо этого я просто создал переменную NSObject внутри этого viewController и смог заставить ее работать таким образом. Я принимаю этот ответ, как обычно, это будет проблемой (делегат/источник данных не подключен). – skind

0

в виде коллекции источнике данных для методов numberOfSectionsInCollectionView возврата 1 и в collectionViewNumberOfCellsForSection возвращает количество ячеек, которые вы хотите отобразить

уточнить на Tableview или коллекция просмотра «раздел» представляет собой группу взаимосвязанных вещей, где в качестве ячейки (или строки для таблицы) используются фактические вещи, которые вы хотите отобразить, - когда вы не переопределяете количество требуемых ячеек, оно будет возвращать 0 для всех разделов

(плохо проверить точный метод signatu Рез утром и редактирования, если они слегка не)

0

Написать это:

class FamilyViewController: UIViewController, UICollectionViewDataSource,UICollectionViewDelegate{ 

и написать эти две строки в методе viewDidLoad:

familyCollectionView.delegate = self 

familyCollectionView.datasource = self 
Смежные вопросы