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