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.


No responses yet

Leave a Reply

UIDocument Demystified: A Step-by-step Guide on Local and iCloud Document Storage