UICollectionView with one static cell and N dynamic ones from a fetchresultscontroller exception

Posted by nflacco on Stack Overflow See other posts from Stack Overflow or by nflacco
Published on 2014-08-24T22:16:28Z Indexed on 2014/08/24 22:20 UTC
Read the original article Hit count: 297

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: "")
    }
}

© Stack Overflow or respective owner

Related posts about core-data

Related posts about uicollectionview