纯代码创建导航控制器UINavigationController

在Xcode6.1中创建single view application的项目,删除Main.storyboard文件,删除info.plist中main storyboard相关属性,依靠代码编写UI视图,研究导航控制器栈的原理。

AppDelegate.h文件代码

 #import <UIKit/UIKit.h>

 @interface AppDelegate : UIResponder <UIApplicationDelegate>

 @property (strong, nonatomic) UIWindow *window;

 @end

AppDelegate.m

 #import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *firstView = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:firstView];
[nav.navigationController pushViewController:firstView animated:YES];
self.window.rootViewController = nav;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible]; return YES;
} - (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
} - (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
} - (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
} - (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
} - (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
} @end
  • 若要实现导航控制器对视图的切换导航,UINavigationController就必须成为视图的根控制器
  • 导航控制器中存在导航控制栈,显示新视图的过程就是入栈的过称[nav.navigationController pushViewController:firstView animated:YES]
  • 出栈则为pop

ViewController.h

 #import <UIKit/UIKit.h>

 @interface ViewController : UIViewController

 - (IBAction)goToSecondView:(id)sender;
@end

第二个视图的控制器头文件,定义IBAction方法,用来显示第二个视图

ViewController.m

 #import "ViewController.h"
#import "SecondViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
label.text = @"This the first view";
[self.view addSubview:label];
UIButton *nextView = [[UIButton alloc] initWithFrame:CGRectMake(, , , )];
[nextView setTitle:@"Next View" forState:UIControlStateNormal];
[nextView setBackgroundColor:[UIColor blueColor]];
[nextView setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[nextView addTarget:self action:@selector(goToSecondView:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:nextView]; } - (IBAction)goToSecondView:(id)sender {
SecondViewController *second = [[SecondViewController alloc] init];
[self.navigationController pushViewController:second animated:YES];
// UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"123" message:@"321" delegate:nil cancelButtonTitle:@"111" otherButtonTitles: nil];
// [alert show];
NSLog(@"click");
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
  • 代码创建UILabel的方法是[[UILabel alloc] initWithFrame:CGRectMake(10, 50, 200, 40)]
  • 将UI视图添加到当前控制器的视图中的方法[self.view addSubview:label]
  • 创建UIButton并设置按钮的背景颜色、标题等属性
  • 将视图与IBAction方法关联的代码[nextView addTarget:self action:@selector(goToSecondView:) forControlEvents:UIControlEventTouchDown]
  • 创建第二视图控制器的实例,并把视图控制器压入控制器栈即可显示新视图[self.navigationController pushViewController:second animated:YES];

SecondViewController.h

 #import <UIKit/UIKit.h>

 @interface SecondViewController : UIViewController
- (IBAction)goToThird:(id)sender;
@end
 #import "SecondViewController.h"
#import "ThirdViewController.h" @interface SecondViewController () @end @implementation SecondViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIButton *nextView = [[UIButton alloc] initWithFrame:CGRectMake(, , , )];
[nextView setTitle:@"Next View" forState:UIControlStateNormal];
[nextView setBackgroundColor:[UIColor blueColor]];
[nextView setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[nextView addTarget:self action:@selector(goToThird:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:nextView];
} - (void)viewDidAppear:(BOOL)animated {
UILabel *secondLabel = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
secondLabel.text = @"This is the second view";
[self.view addSubview:secondLabel];
} - (IBAction)goToThird:(id)sender {
ThirdViewController *third = [[ThirdViewController alloc] init];
[self.navigationController pushViewController:third animated:YES];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} /*
#pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/ @end

ThirdViewController.h

 #import <UIKit/UIKit.h>

 @interface ThirdViewController : UIViewController

 @end

ThirdViewController.m

 #import "ThirdViewController.h"

 @interface ThirdViewController ()

 @end

 @implementation ThirdViewController

 - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (void)viewDidAppear:(BOOL)animated {
UILabel *secondLabel = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
secondLabel.text = @"This is the third view";
[self.view addSubview:secondLabel];
} /*
#pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/ @end

第二视图和第三视图代码结构与第一视图类似,输入完以上代码后,运行程序即可实现简单的导航控制器切换视图的功能。

iOS学习笔记(3)--初识UINavigationController(无storyboard)的更多相关文章

  1. IOS 学习笔记(2) 视图UINavigationController

    1.栈 导航控制器自身有一个针对显示内容的栈,也有一个对于导航栏的栈,当有新的内容欲显示时,进的导航栏和显示内容会被压入此栈,这样原本显示中的导航栏和显示内容则会进入到栈的更深一层中,根据栈的先进后出 ...

  2. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  3. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  4. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  5. Storm学习笔记 - Storm初识

    Storm学习笔记 - Storm初识 1. Strom是什么? Storm是一个开源免费的分布式计算框架,可以实时处理大量的数据流. 2. Storm的特点 高性能,低延迟. 分布式:可解决数据量大 ...

  6. iOS学习笔记-地图MapKit入门

    代码地址如下:http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错漏 ...

  7. iOS学习笔记22-推送通知

    一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...

  8. iOS学习笔记20-地图(二)MapKit框架

    一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...

  9. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  10. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

随机推荐

  1. Python3 min() 函数

    Python3 min() 函数  Python3 数字 描述 min() 方法返回给定参数的最小值,参数可以为序列. 语法 以下是 min() 方法的语法: min( x, y, z, .... ) ...

  2. Socket调用方式(同步,异步,阻塞,非阻塞)

    同步: 我调用一个功能,该功能没有结束前,我死等结果. 异步: 当一个异步过程调用发出后,调用者不能立刻得到结果.该功能在完成后,通过状态.通知和回调来通知调用者. 同步和非同步关注的是调用者是否等待 ...

  3. iOS下nil 、NULL、 Nil 、NSNull的区别

    1.nil,定义一个空的实例,指向OC中对象的空指针. 示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = ...

  4. jetty tutorial

    http://www.eclipse.org/jetty/documentation/current/embedding-jetty.html#d0e18726 Version: 9.2.2-SNAP ...

  5. 对象转换利器之Dozer

    什么是Dozer Dozer是一个Java对象转换工具,可以在JavaBean和JavaBean之间进行递归数据复制,并且适应不同复杂的类型.Dozer会直接将名称相同的属性进行复制,属性名不同或者有 ...

  6. 安装python-empy

    sudo python setup.py install

  7. CoreText

    [CoreText]  Core Text is designed for development of higher-level text-handling frameworks. General ...

  8. 前端福利之jQuery文字轮播特效(转)

    闲谈:离开学校那座象牙塔已经也有大半年的事件了,生活中不再充满了茫然只有忙碌.连续加班加点大半个月,做的活动项目终于算是告一段落了,而今天也将是考验其真正价值的时候,现在将这次开发中遇到的问题做一下总 ...

  9. redis 设置认证

    server 使用帮助 [root@VM_7_88_centos src]# ./redis-server -h Usage: ./redis-server [/path/to/redis.conf] ...

  10. dojoConfig包的配置(7/26号夜)

    主页代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...