The tableView Workshop Series: Gouping Rows

The main goal of this workshop is to show you how to present the tableView’s rows in one or more groups.

Say we want to group the MasterViewController’s rows; well, would have to first change the tableView’s Style attribute in Interface Builder from Plain to group then modify code in a few methods of the tableView control.

Here is the first method to modify. The statement will return the number 6, because there are 6 Keys (Categories) in the plist file.

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return self.tableDataSource.count;
}

Add code shown below in the numberOfRowsInSection and the titleForHeaderInSection method.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
	// Create an object of the AppDelegate so we can use its variables and methods
	AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

	// Get data from the plist file and assign it to a mutable array
	NSDictionary *itemList = [delegate.self fetchShoppingListItems];

	// Place a section key (for example, Books) in a variable
	NSString *sectionKey = [self.tableDataSource objectAtIndex:section];

	// Place the section's item names (Going Home, One for The Money) in an array
	NSArray *sectionNames = [itemList objectForKey:sectionKey];

	return [sectionNames count];
	//return self.tableDataSource.count;
}

// This method display section headers
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
	// Display section headers
	NSString *groupHeadings = [self.tableDataSource objectAtIndex:section];
	return groupHeadings;
}

Finally, add code shown below in the method.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
	static NSString *CellIdentifier = @"Cell";

	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
	if (cell == nil) {
	  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
	  cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
	}

	// Create an object of the AppDelegate so we can use its variables and methods
        AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

	// Get an element of the tableDataSource array and place it in the sectionName object; for example, Books
	NSString *sectionName = [self.tableDataSource objectAtIndex:[indexPath section]];

	// Get items belonging to that sectionName, place them in the array
	NSDictionary *dicItems = [delegate.self fetchShoppingListItems];
	NSArray *itemNames = [dicItems objectForKey:sectionName];

	// Display the itemNames in six groups
	cell.textLabel.text = [itemNames objectAtIndex:indexPath.row];
	return cell;
}

When you are done, run the application. The MasterViewController’s tableView will now look the snap shot shown below. Since there are no items for two categories (Electronics & Appliances, Entertainment) no group were created for them.
workshopseries-fig20