I have an NSArray of objects:
MyObject consists of the following string properties:
Title
Category
Name
There are a total of 9 categories.
I would like to display these categories sectioned in a UITableView.
At the moment my code looks like this, but it’s not quite right and I’m unsure of how to handle the individual categories in my
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;` as well.
for (ArrayOfMyObject *item in myArray) {
if ([item.Category isEqualToString:@"Category1"]) {
NSDictionary *dict = [NSDictionary dictionaryWithObjects:item forKey:item.Category];
[self.itemsArray addObject:dict];
}
if ([item.Category isEqualToString:@"Category2"]) {
NSDictionary *dict = [NSDictionary dictionaryWithObjects:item forKey:item.Category];
[self.itemsArray addObject:dict];
}
... (etc, for the rest of the Category titles).
}
I should be getting a total of 9 sections if there’s 9 categories, but it looks like I’m actually getting the total count of items (there’s like 76). Any help would be greatly appreciated and feel free to request more code if need-be.
I guess I would also need to know how to handle this inside the cellForRowAtIndexPath method.
Would I do something like this?
MyObject *item = (MyObject *)[self.itemsArray objectAtIndex:indexPath.row];
NSMutableDictionary *dictionary = [self.itemsArray objectAtIndex:indexPath.section];
NSArray *categoryArray = [dictionary objectForKey:item.Category];
I’d start by organising your data source in a different way.
Get a datasource NSArray that contains 9 NSDictionaries representing your categories. Inside each category, you have a couple of keys – one for a corresponding string with the category name and one for a corresponding array of MyObjects that belong to the category:
Once you have the data organised this way, your datasource methods for the table view will look like this (conceptually):
numberOfSections can be accessed with
[datasource count]titleForSection can be accessed with
[[datasource objectAtIndex:indexPath.section] valueForKey:@"catName"]numberOfRowsInSection can be accessed with
[[[datasource objectAtIndex:indexPath.section] valueForKey:@"objects"] count]And finally, the MyObject for each row can be accessed with
[[[datasource objectAtIndex:indexPath.section] valueForKey:@"objects"] objectAtIndex:indexPath.row]on the cellForRowAtIndexPath: method.Makes sense?
Let me know if you have any questions.
Cheers,
Rog
[EDIT TO ANSWER YOUR FOLLOW UP QUESTION]
This is based on a few assumptions but you should get the gist of it. For the purpose of testing this, I created a MyObject class that returns an instance with random generated category names.