UICollectionView with one static cell and N dynamic ones from a fetchresultscontroller exception
- by nflacco
I'm trying to make a UITableView that shows a blog post and comments for that post. My setup is a tableview in storyboard with two dynamic prototype cells. The first cell is for the post and should never change. The second cell represents the 0 to N comments.
My cellForRowAtIndexPath method shows the post cell properly, but fails to get the comment at the given index path (though if I comment out the fetch I get the appropriate number of comment cells with a green background that I set as a visual debug thing).
let comment = fetchedResultController.objectAtIndexPath(indexPath) as Comment
I get the following exception on this line:
2014-08-24 15:06:40.712 MessagePosting[21767:3266409] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000101aa43e5 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001037f9967 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010198f4c3 -[__NSArrayM objectAtIndex:] + 227
    3   CoreData                            0x00000001016e4792 -[NSFetchedResultsController objectAtIndexPath:] + 162
Section and cell setup:
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.
    switch section {
    case 0:
        return 1
    default:
        if let realPost:Post = post {
            return fetchedResultController.sections[0].numberOfObjects
        } else {
            return 0
        }
    }
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    switch indexPath.section {
    case 0:
        let cell = tableView.dequeueReusableCellWithIdentifier(postViewCellIdentifier, forIndexPath: indexPath) as UITableViewCell
        cell.backgroundColor = lightGrey
        if let realPost:Post = self.post {
            cell.textLabel.text = realPost.text
        }
        return cell
    default:
        let cell = tableView.dequeueReusableCellWithIdentifier(commentCellIdentifier, forIndexPath: indexPath) as UITableViewCell
        cell.backgroundColor = UIColor.greenColor()
        let comment = fetchedResultController.objectAtIndexPath(indexPath) as Comment  // <---------------------------- :(
        cell.textLabel.text = comment.text
        return cell
    }
}
FRC:
func controllerDidChangeContent(controller: NSFetchedResultsController!) {
    tableView.reloadData()
}
func getFetchedResultController() -> NSFetchedResultsController {
    fetchedResultController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
    return fetchedResultController
}
func taskFetchRequest() -> NSFetchRequest {
    if let realPost:Post = self.post {
        let fetchRequest = NSFetchRequest(entityName: "Comment")
        let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
        fetchRequest.predicate = NSPredicate(format: "post = %@", realPost)
        fetchRequest.sortDescriptors = [sortDescriptor]
        return fetchRequest
    } else {
        return NSFetchRequest(entityName: "")
    }
}