The following topics are covered in this tutorial
Interface file for Country Object - Country.h
#import <Foundation/Foundation.h>
@interface Country : NSObject
@property (nonatomic, strong) NSString *code;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *continent;
@property (nonatomic, strong) NSNumber *population;
-(id)initWithCode:(NSString *)code_
name:(NSString *)name_
continent:(NSString *)continent_
population:(NSNumber *)population_;
@end
Implementation file for Country Object - Country.m
#import "Country.h"
@implementation Country
@synthesize code;
@synthesize name;
@synthesize continent;
@synthesize population;
-(id)initWithCode:(NSString *)code_
name:(NSString *)name_
continent:(NSString *)continent_
population:(NSNumber *)population_
{
self = [super init];
if (self) {
self.code = code_;
self.name = name_;
self.continent = continent_;
self.population = population_;
}
return self;
}
@end
Interface file for Continent Object - Continent.h
#import <Foundation/Foundation.h> @interface Continent : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSMutableArray *countryList; @end
Implementation file for Continent Object - Continent.m
#import "Continent.h" @implementation Continent @synthesize name; @synthesize countryList; @end
Interface file for Root View Controller - CountryViewController.h
#import <UIKit/UIKit.h>
#import "Country.h"
#import "Continent.h"
#import "CountryDetailViewController.h"
@interface CountryViewController : UIViewController
<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic, strong) UITableView *myTableView;
@property (nonatomic, strong) NSMutableArray *continentList;
@property (nonatomic, strong) CountryDetailViewController *detailViewController;
@end
Implementation file for Root View Controller - CountryViewController.m
#import "CountryViewController.h"
@interface CountryViewController ()
@end
@implementation CountryViewController
@synthesize myTableView;
@synthesize continentList;
@synthesize detailViewController;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//intialize our data to be displayed in the table view
[self loadCountryData];
}
return self;
}
//create mutable array to hold list of countries that will be displayed
- (void) loadCountryData {
NSMutableArray *array = [[NSMutableArray alloc] init];
self.continentList = array;
NSMutableArray *countryList = [[NSMutableArray alloc] init];
Country *country = [[Country alloc] initWithCode:@"USA"
name:@"United States"
continent:@"North America"
population:[[NSNumber alloc] initWithInt:989898]];
[countryList addObject:country];
country = [[Country alloc] initWithCode:@"CAN"
name:@"Canada"
continent:@"North America"
population:[[NSNumber alloc] initWithInt:979797]];
[countryList addObject:country];
country = [[Country alloc] initWithCode:@"MXN"
name:@"Mexico"
continent:@"North America"
population:[[NSNumber alloc] initWithInt:969696]];
[countryList addObject:country];
Continent *continent = [[Continent alloc] init];
continent.name = @"North America";
continent.countryList = countryList;
[self.continentList addObject:continent];
countryList = [[NSMutableArray alloc] init];
country = [[Country alloc] initWithCode:@"CHN"
name:@"China"
continent:@"Asia"
population:[[NSNumber alloc] initWithInt:959595]];
[countryList addObject:country];
country = [[Country alloc] initWithCode:@"AFG"
name:@"Afghanistan"
continent:@"Asia"
population:[[NSNumber alloc] initWithInt:939393]];
[countryList addObject:country];
continent = [[Continent alloc] init];
continent.name = @"Asia";
continent.countryList = countryList;
[self.continentList addObject:continent];
}
- (void)viewDidLoad
{
[super viewDidLoad];
//set the background color
self.view.backgroundColor = [UIColor whiteColor];
//create the table view with a given style
self.myTableView = [[UITableView alloc] initWithFrame:self.view.bounds
style:UITableViewStyleGrouped];
//set the table view delegate to the current so we can listen for events
self.myTableView.delegate = self;
//set the datasource for the table view to the current object
self.myTableView.dataSource = self;
//make sure our table view resizes correctly
self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleHeight;
//add the table view to the main view
[self.view addSubview:self.myTableView];
}
//asks the data source to return the number of sections in the table view
//we are retuneing the number of continents
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
NSLog(@"%@",@"Called number of Sections in Table View");
NSInteger numberOfSections = 0;
if ([tableView isEqual:self.myTableView]){
numberOfSections = self.continentList.count;
}
return numberOfSections;
}
//asks the data source to return the number of rows in a given section of a table view
//we are returning the number of countries in a given continent
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section{
NSLog(@"%@",@"Called number of Rows in a Section");
NSInteger numberOfRows = 0;
if ([tableView isEqual:self.myTableView]){
Continent *continent = [[Continent alloc] init];
continent = [self.continentList objectAtIndex:section];
numberOfRows = continent.countryList.count;
}
return numberOfRows;
}
//asks the data source for a cell to insert in a particular location of the table view
- (UITableViewCell *) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%@",@"Render cell at a given Index Path Section and Row");
UITableViewCell *myCellView = nil;
if ([tableView isEqual:self.myTableView]){
static NSString *TableViewCellIdentifier = @"MyCells";
//this method dequeues an existing cell if one is available or creates a new one
//if no cell is available for reuse, this method returns nil
myCellView = [tableView dequeueReusableCellWithIdentifier:TableViewCellIdentifier];
if (myCellView == nil){
//create a new cell
myCellView = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:TableViewCellIdentifier];
}
//get the continent based on the index path section
Continent *continent = [[Continent alloc] init];
continent = [self.continentList objectAtIndex:indexPath.section];
//get the country to display based on the index path row
NSMutableArray *countryList = [[NSMutableArray alloc] init];
countryList = continent.countryList;
Country *country = [[Country alloc] init];
country = [countryList objectAtIndex:indexPath.row];
//display the country name in main label of the cell
myCellView.textLabel.text = [NSString stringWithFormat:@"%@",
country.name];
//set the accessory view to be a clickable button
myCellView.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
}
return myCellView;
}
//asks the delegate for the height to use for a row in a specified location
- (CGFloat) tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%@",@"Set the row height");
CGFloat result = 20.0f;
if ([tableView isEqual:self.myTableView]){
result = 45.0f;
}
return result;
}
//Asks the delegate for a view object to display in the header of the specified
//section of the table view, display the continent name in the header view
- (UIView *) tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section{
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)];
headerView.backgroundColor = [UIColor clearColor];
Continent *continent = [[Continent alloc] init];
continent = [self.continentList objectAtIndex:section];
if ([tableView isEqual:self.myTableView]){
UILabel *result = [[UILabel alloc]
initWithFrame:CGRectMake(12, 0, tableView.bounds.size.width, 30)];
result.font = [UIFont boldSystemFontOfSize:16.0f];
result.text = [NSString stringWithFormat:@"%@ :", continent.name];
result.backgroundColor = [UIColor clearColor];
[headerView addSubview:result];
}
return headerView;
}
//asks the delegate for a view object to display in the footer of the specified
//section of the table view
- (UIView *) tableView:(UITableView *)tableView
viewForFooterInSection:(NSInteger)section{
UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)];
footerView.backgroundColor = [UIColor clearColor];
if ([tableView isEqual:self.myTableView]){
UILabel *result = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)];
result.font = [UIFont boldSystemFontOfSize:12.0f];
result.text = [NSString stringWithFormat:@"Section %d Footer",
section];
result.textAlignment = NSTextAlignmentCenter;
result.backgroundColor = [UIColor clearColor];
[footerView addSubview:result];
}
return footerView;
}
//asks the delegate for the height to use for the header of a particular section
- (CGFloat) tableView:(UITableView *)tableView
heightForHeaderInSection:(NSInteger)section{
CGFloat result = 0.0f;
if ([tableView isEqual:self.myTableView]){
result = 25.0f;
}
return result;
}
//asks the delegate for the height to use for the footer of a particular section
- (CGFloat) tableView:(UITableView *)tableView
heightForFooterInSection:(NSInteger)section{
CGFloat result = 0.0f;
if ([tableView isEqual:self.myTableView]){
result = 20.0f;
}
return result;
}
//informs the delegate that the specified row is now selected
- (void) tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView isEqual:self.myTableView]){
NSLog(@"%@",
[NSString stringWithFormat:@"Cell %ld in Section %ld is selected",
(long)indexPath.row, (long)indexPath.section]);
Country *country = [self getCountryName:indexPath];
NSLog(@"%@",
[NSString stringWithFormat:@"Country is %@ and code is %@", country.name, country.code]);
}
}
//informs the delegate that the user tapped the accessory view associated with a given row
- (void) tableView:(UITableView *)tableView
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
if ([tableView isEqual:self.myTableView]){
NSLog(@"%@",
[NSString stringWithFormat:@"Cell %ld accessory button in Section %ld is tapped",
(long)indexPath.row, (long)indexPath.section]);
Country *country = [self getCountryName:indexPath];
NSLog(@"%@",
[NSString stringWithFormat:@"Country is %@ and code is %@", country.name, country.code]);
//if the detail view controller doesn't exists create it
if(self.detailViewController == nil){
CountryDetailViewController *detailView = [[CountryDetailViewController alloc] init];
self.detailViewController = detailView;
}
//set the country object of the second view controller
[self.detailViewController setCountry:country];
//tell the navigation controller to push a new view into the stack
[self.navigationController pushViewController:self.detailViewController animated:YES];
}
}
//find the country based on a given index path
- (Country *) getCountryName:(NSIndexPath *)indexPath {
Continent *continent = [[Continent alloc] init];
continent = [self.continentList objectAtIndex:indexPath.section];
NSMutableArray *countryList = [[NSMutableArray alloc] init];
countryList = continent.countryList;
Country *country = [[Country alloc] init];
country = [countryList objectAtIndex:indexPath.row];
return country;
}
- (void) didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Interface file for Detail View Controller - CountryDetailViewController.h
#import <UIKit/UIKit.h> #import "Country.h" @interface CountryDetailViewController : UIViewController @property (nonatomic, strong) Country *country; @property (nonatomic, strong) UILabel *countryCode, *continentName, *population; @end
Implementation file for Detail View Controller - CountryDetailViewController.m
#import "CountryDetailViewController.h"
@interface CountryDetailViewController ()
@end
@implementation CountryDetailViewController
@synthesize country;
@synthesize countryCode, continentName, population;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%@",@"Country Detail View is Loading");
[self.view setBackgroundColor:[UIColor whiteColor]];
self.countryCode = [[UILabel alloc] init];
[self.countryCode setFrame:CGRectMake(10.0,10.0,250.0,30.0)];
[self.view addSubview: self.countryCode];
self.continentName = [[UILabel alloc] init];
[self.continentName setFrame:CGRectMake(10.0,40.0,250.0,30.0)];
[self.view addSubview: self.continentName];
self.population = [[UILabel alloc] init];
[self.population setFrame:CGRectMake(10.0,70.0,250.0,30.0)];
[self.view addSubview: self.population];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
[self.navigationItem setTitle:self.country.name];
[self.countryCode setText:[NSString stringWithFormat:@"Country code is %@ ",
country.code]];
[self.continentName setText:[NSString stringWithFormat:@"in continent %@ ",
country.continent]];
[self.population setText:[NSString stringWithFormat:@"has population of %@ ",
country.population]];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Interface file for Table View App Delegate - TableViewExampleAppDelegate.h
#import <UIKit/UIKit.h> #import "CountryViewController.h" @interface TableViewExampleAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (nonatomic, retain) UINavigationController *myNavigationController; @property (nonatomic, retain) CountryViewController *countryViewController; @end
Implementation file for Table View App Delegate - TableViewExampleAppDelegate.m
#import "TableViewExampleAppDelegate.h"
@implementation TableViewExampleAppDelegate
@synthesize myNavigationController;
@synthesize countryViewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//create the navigation controller and add to the view
myNavigationController = [[UINavigationController alloc] init];
[self.window addSubview:[self.myNavigationController view]];
//check if the first viewcontroller eixsts, otherwise create it
if(self.countryViewController == nil)
{
CountryViewController *countryView = [[CountryViewController alloc] init];
self.countryViewController = countryView;
}
//push the first viewcontroller into the navigation viewcontroller stack
[self.myNavigationController pushViewController:self.countryViewController animated:YES];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application
{
//do nothing
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
//do nothing
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
//do nothing
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
//do nothing
}
- (void)applicationWillTerminate:(UIApplication *)application
{
//do nothing
}
@end


No comments:
Post a Comment
NO JUNK, Please try to keep this clean and related to the topic at hand.
Comments are for users to ask questions, collaborate or improve on existing.