zoukankan      html  css  js  c++  java
  • Iphone用UINavigationController实现在两个页之间导航(上)

    要求: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 user interface的选择框。为文件起个名字,本例视图控制器名称为cityViewController,(类名称习惯以一个大写字母开头)。请务必创建.m.h文件,并将二者都添加到工程。此时,系统已经生成三个文件(*.h*.m*.xib, 实际实现了四项任务:

    1)系统为你创建了一个视图控制器(名叫FilesOwner对象),类名为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 user interface的选择框。为文件起个名字,视图控制器名称为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 mark Application 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:nil action:nil];
        //设置启动应用时第一个要显示的视图控制器,这里是cityViewContrl
        cityViewController *cityViewContrl = [[cityViewController alloc] init];
        cityViewContrl.title = @"旅游指南";//设置第一个视图控制器的标题
        //设置返回按钮
        cityViewContrl.navigationItem.backBarButtonItem= backButton;
        [backButton release];
        //把第一个视图控制器推push到堆栈中
        [navController pushViewController:cityViewContrl animated:NO];
        //这里假定是导航栏的第一个视图,所以animated:NO不要动画化。
        [cityViewContrl release];
        //把导航(标签栏)控制器放到Window下
        //[window addSubview:navController.view];
        [window addSubview:tabBarController.view];
       
        // Override point for customization after application launch.
        [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 Memory management
    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
       
    }
    - (void)dealloc {
        [tabBarController release];//释放内存
        [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
                = [[CityDetailViewController alloc] init];//初始化CityDetailViewController
        cityDetailContrl.title = @ "北京欢迎您";//设置第二个视图控制器标题
        cityDetailContrl.city = @"北京";//设置要传到下一个控制器的数据——北京
        //把第二视图控制器推入堆栈中
    [self.navigationController pushViewController:cityDetailContrl animated:YES];
        [cityDetailContrl release];//释放内存
    }
     
     
    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad {
    //创建一个有边框的文体按钮,按下后,调用视图控制器上的discount方法
    UIBarButtonItem *discountButton = [[UIBarButtonItem alloc]
                        initWithTitle:@"折扣信息" style:UIBarButtonItemStyleBordered
                                    target:self action:@selector(discount:)];
        self.navigationItem.leftBarButtonItem = discountButton;//设置为左边按钮
        [discountButton release];//释放内存
        //设置视图控制器在标签栏上的标题和图像
        // 文字是:旅游指南。图像是:GoldenGateBridge.png
        UITabBarItem *item = [[UITabBarItem alloc]
                              initWithTitle:@"旅游指南"
                              //initWithTabBarSystemItem:UITabBarSystemItemBookmarks
                              image:[UIImage imageNamed:@"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 in use.
    }
     
    - (void)viewDidUnload {
        [super viewDidUnload];
        // Release any retained subviews of the main 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 loading the 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;
        [rightButton 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 in use.
    }
    - (void)viewDidUnload {
        [super viewDidUnload];
        // Release any retained subviews of the main view.
        // e.g. self.myOutlet = nil;
    }
    - (void)dealloc {
        [super dealloc];
    }
    @end
    //CityDetailViewController.m原代码结束
    android 技术交流QQ群:108614806
  • 相关阅读:
    [转] JS报 “尚未实现” 错误
    分享到国内各SNS网站的代码
    IE8以下版本不支持动态创建的HTML5元素?
    一个较为个性化的出生日期选择
    关于拖拽上传 [一个拖拽上传修改头像的流程]
    用CSS写出漂亮的小三角
    用户自定义模块的实现方案
    纪录一则IE的bug
    onpropertychange 和 oninput
    判断脚本加载完毕
  • 原文地址:https://www.cnblogs.com/zhiqiangsimida/p/2774604.html
Copyright © 2011-2022 走看看