用UINavigationController实现在两个页之间导航(上)

UINavigationController实现在两个页之间导航(上)——书第七章 P143

要求:1、从基于Xcode空项目模板开始

     2、两页之间能相互传递数据

     3、在导航控制栏上添加系统按钮和左右按钮

实现方法分析

1、根据MVC模式,iphone的程序都是有 view-model-controller 组成的。所以,在两个页面就是两个视图控制器和其管理的View。因此:

第一页定义为:cityViewController

第二页定义为:CityDetailViewController

导航控制器在这两个视图控制器之间切换!工程项目名称为:lvyou

2、开发步骤:

第一步:创建一个工程项目。项目名称:lvyou、基于空模板(Windows-based Application)

第二步:创建cityViewController视图控制器

>>请选择File > New File。在New File窗口中,请选择Cocoa Touch Classes,然后选择UIViewController-subclass。同时,请勾选Options区域中标题为With XIB for userinterface的选择框。为文件起个名字,本例视图控制器名称为cityViewController,(类名称习惯以一个大写字母开头)。请务必创建.m和.h文件,并将二者都添加到工程。此时,系统已经生成三个文件(*.h、*.m、*.xib), 实际实现了四项任务:

1)系统为你创建了一个视图控制器(名叫File’sOwner对象),类名为cityViewController

2)系统也为你创建了一个视图view(点*.xib上打开)

3)在视图控制器类上,系统也为你定义了一个输出口IBOulet变量view

4)这个变量(输出口IBOulet变量view)已经关联了视图view

第三步:同样方法创建CityDetailViewController视图控制器。

>>请选择File > New File。在New File窗口中,请选择Cocoa Touch Classes,然后选择UIViewController-subclass。同时,请勾选Options区域中标题为With XIB for userinterface的选择框。为文件起个名字,视图控制器名称为CityDetailViewController。此时,系统已经生成三个文件(*.h、*.m、*.xib),同样也实际实现了上述的四项任务。

第四步:添加(注册)一个导航控制器。

(注册cityViewController是第一个要显示视图控制器)只能用代码方法!(当然,如果你创建工程项目时选择“基于导航的应用”。就会为你自动创建一个名为RootViewController的根视图控制器,并自动生成了一些代码,比如把导航控制器的视图放到窗口的视图内)

方法:在lvyouAppDelegate.h上声明(添加)一个UINavigationController类对象

//lvyouAppDelegate.h原代码开始

#import <UIKit/UIKit.h>

@interface lvyouAppDelegate :NSObject <UIApplicationDelegate> {

   UIWindow *window;

   UINavigationController*navController;//此行新加,对应的实现文件.m上必须要有代码!

   UITabBarController *tabBarController; // 声明一个标签控制器,下一节讲

}

@property (nonatomic,retain) IBOutlet UIWindow *window;

@end

//lvyouAppDelegate.h原代码结束

 

//lvyouAppDelegate.m原代码开始

#import "lvyouAppDelegate.h"

#import "cityViewController.h"//此处要加上

#import "MeiShiTianDi.h"

@implementation lvyouAppDelegate

@synthesize window;

#pragma mark-

#pragma markApplication lifecycle

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions   

   

   tabBarController = [[UITabBarController alloc] init];//初始化标签栏控制器

   MeiShiTianDi *viewController =[[MeiShiTianDi alloc]init];//初始化控制器

   viewController.title=@"美食天地";

   navController = [[UINavigationController alloc] init];//初始化导航控制器

   //加入标签栏控制器的控制器数量矩阵

   tabBarController.viewControllers=

   [NSArray arrayWithObjects:navController, viewController,nil];

   

   [viewController release];

   //定义名称为“所有城市”的返回按钮。该按钮无需target和action

//因为系统已经实现了返回功能。Style是显示风格

   UIBarButtonItem *backButton=

      [[UIBarButtonItem alloc] initWithTitle:@"所有城市"

          style:UIBarButtonItemStyleBordered

          target:nilaction:nil];

   //设置启动应用时第一个要显示的视图控制器,这里是cityViewContrl

   cityViewController*cityViewContrl =[[cityViewController alloc] init];

   cityViewContrl.title =@"旅游指南";//设置第一个视图控制器的标题

   //设置返回按钮

   cityViewContrl.navigationItem.backBarButtonItem= backButton;

   [backButtonrelease];

   //把第一个视图控制器推push到堆栈中

   [navController pushViewController:cityViewContrl animated:NO];

   //这里假定是导航栏的第一个视图,所以animated:NO不要动画化。

   [cityViewContrl release];

   //把导航(标签栏)控制器放到Window

   //[window addSubview:navController.view];

   [window addSubview:tabBarController.view];

   

   // Override point for customization after applicationlaunch.

   [window makeKeyAndVisible];

   return YES;

}

- (void)applicationWillResignActive:(UIApplication *)application {

   

}

- (void)applicationDidEnterBackground:(UIApplication *)application {

   

}

- (void)applicationWillEnterForeground:(UIApplication *)application {

   

}

- (void)applicationDidBecomeActive:(UIApplication *)application {

   

}

- (void)applicationWillTerminate:(UIApplication *)application {

   

}

#pragma mark-

#pragma mark Memorymanagement

- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application {

   

}

- (void)dealloc {

   [tabBarControllerrelease];//释放内存

   [navController release];

   [window release];

   [super dealloc];

}

@end

//lvyouAppDelegate.m原代码结束

 

第五步:设计完善cityViewController视图控制器。

首先在cityViewController.xib上添加一个按钮,修改按钮标题为“北京”。在cityViewController.h中声明一个方法selectCity。将按钮与方法建立连接!

//cityViewController.h原代码开始

#import <UIKit/UIKit.h>

@interface cityViewController : UIViewController{

   }

- (IBAction)selectCity : (id)sender;//自定义一个方法,点击“北京”按钮,进入下一页

@end

//cityViewController.h原代码结束

 

//cityViewController.m原代码开始

#import "cityViewController.h"

#import "CityDetailViewController.h"//新加上的,声明注册CityDetailViewController

 

@implementation cityViewController  //定义属性

//实现自定义的方法(函数)

-(IBAction) selectCity : (id)sender{

   CityDetailViewController *cityDetailContrl

           = [[CityDetailViewControlleralloc] init];//初始化CityDetailViewController

   cityDetailContrl.title = @"北京欢迎您";//设置第二个视图控制器标题

   cityDetailContrl.city = @"北京";//设置要传到下一个控制器的数据——北京

   //把第二视图控制器推入堆栈中

[self.navigationController pushViewController:cityDetailContrl animated:YES];

   [cityDetailContrlrelease];//释放内存

}

 

 

// Implement viewDidLoad to do additional setup after loadingthe view, typically from a nib.

- (void)viewDidLoad {

//创建一个有边框的文体按钮,按下后,调用视图控制器上的discount方法

UIBarButtonItem *discountButton =[[UIBarButtonItem alloc]

                   initWithTitle:@"折扣信息" style:UIBarButtonItemStyleBordered

                               target:selfaction:@selector(discount:)];

   self.navigationItem.leftBarButtonItem =discountButton;//设置为左边按钮

   [discountButtonrelease];//释放内存

   //设置视图控制器在标签栏上的标题和图像

   // 文字是:旅游指南。图像是:GoldenGateBridge.png

   UITabBarItem *item = [[UITabBarItem alloc]

                        initWithTitle:@"旅游指南"

                        //initWithTabBarSystemItem:UITabBarSystemItemBookmarks

                         image:[UIImageimageNamed:@"GoldenGateBridge.png"]

                        tag:0];

   self.tabBarItem = item;

   [item release];

   

   [super viewDidLoad];

}

 

 

- (void)didReceiveMemoryWarning {

   // Releases the view if it doesn't have a superview.

   [super didReceiveMemoryWarning];

   

   // Release any cached data, images, etc that aren't inuse.

}

 

- (void)viewDidUnload {

   [super viewDidUnload];

   // Release any retained subviews of themain view.

   // e.g. self.myOutlet = nil;

}

- (void)dealloc {

   [super dealloc];

}

@end

//cityViewController.m原代码结束

 

第六步:设计完善CityDetailViewController视图控制器。

首先在CityDetailViewController.xib上添加两个标签Label,其中第一个标签Label修改文字为“北京的介绍信息”(实际应用中城市的介绍信息应该从模型类中读取),第二个标签Label修改文字“城市名称”,因为从前一个页面传递一个数据(城市名称)过来,在第二个页面上要读取,并显示出来。在CityDetailViewController.h中声明一个IBOutlet(命名为cityName),用于关联View上刚刚创建的“城市名称”Label,另外,创建一个属性“city”用于接收从前一个页面传递过来的数据(城市名称)。

//CityDetailViewController.h原代码开始

#import <UIKit/UIKit.h>

@interface CityDetailViewController : UIViewController{

   IBOutlet UILabel*cityName;// 第二个标签Label创建接口IBOutlet

   NSString *city;            //创建一个属性

}

@property (copy) NSString *city; //创建一个属性set/get方法

@end

//CityDetailViewController.h原代码结束

 

//CityDetailViewController.m原代码开始

#import "CityDetailViewController.h"

@implementation CityDetailViewController //实现控制器类

@synthesize city; //属性city变量

 

// Implement viewDidLoad to do additional setup after loadingthe view, typically from a nib.

- (void)viewDidLoad {

   cityName.text = city;//获取从前一个页面传来的数据

   //创建一个系统添加按钮,按下后,调用视图控制器上的add方法

   UIBarButtonItem *rightButton =[[UIBarButtonItem alloc]

      initWithBarButtonSystemItem:UIBarButtonSystemItemAdd

      target:self action:@selector(add:)];// 调用视图控制器上的add方法

   //设置为导航控制器控制条上的右边按钮

self.navigationItem.rightBarButtonItem= rightButton;

   [rightButtonrelease];

   

   [super viewDidLoad];

}

 

- (void)didReceiveMemoryWarning {

   // Releases the view if it doesn't have a superview.

   [super didReceiveMemoryWarning];

   // Release any cached data, images, etc that aren't inuse.

}

- (void)viewDidUnload {

   [super viewDidUnload];

   // Release any retained subviews of themain view.

   // e.g. self.myOutlet = nil;

}

- (void)dealloc {

   [super dealloc];

}

@end

//CityDetailViewController.m原代码结束


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值