Question

I've done some reading up on multiple similar issues and sites and I just cannot make any understanding of this.

I have a NSFetchedResultsController which displays information from a user adding information into a ModalViewController with text fields. The user is presented with a ModalView and they put in some words into the fields, click save and that makes up the single sectioned row of tables in the TableView, which implements the NSFetchedResultsController protocol.

What I would like to do now is:

  • On one of the text fields, be able to create a new section out of the information provided in that one textField.

My fetchrequest is:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController; 

The attribute I want to do display is occasion.date, which means it is a relationship from the Transaction entity to the Occasion Entity (occasion) and the createdDate is an attribute on the Occasion entity.

I can see the sectionNameKeyPath:nil needs to be updated, but what do I update it to, and also do I have to change any of the datasource methods, titles, etc?

Any help on this would be massively appreciated.

Thanks,

Was it helpful?

Solution

The precise answer depends on what should be displayed as section headers and how the sections should be sorted.

But generally, you have to add a property to the entity, which is then used as sectionNameKeyPath parameter. In addition, you have to add a first sort descriptor using the same key (this condition can be relaxed slightly).

For example, if you simply add a string attribute sectionName to the entity and use that as sectionNameKeyPath and as the first sort descriptor key, then all objects with the same value for sectionName will be grouped into one section, and the sections will be sorted by sectionName. The remaining sort descriptors are used to sort the objects within each section.

Another example would be to define a separate entity "Section" with a string attribute "title" and an integer attribute "index", add a to-one relationship "section" from "Transaction" to "Section", and use section.index as sectionNameKeyPath. Again, all objects with the same section are grouped together, but the sections are now sorted by the value of section.index, and you can modify tableView:titleForHeaderInSection: so that the title is displayed in the section header instead of the index.

This is quite general, but I hope that it gets you started.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top