背景

有一个根视图控制器 然后跳转到第一个界面  第一个界面能够返回到根视图 也能够跳转到第二个视图 第二个视图能够直接返回到根视图

新建三个ViewController    RootViewController FirstViewController SecondViewController

首先在AppDelegate.m中写入

#import "WJJAppDelegate.h"
#import "WJJRootViewController.h" @implementation WJJAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
WJJRootViewController * rootViewController = [[WJJRootViewController alloc] init];
//创建一个导航控制器 并把上面创建的root 加入到导航控制器上
UINavigationController * nav = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}

然后再RootViewController中写入 点击button会进入到firstViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self createButton];
} //新建一个button 点击进入写一个界面
- (void)createButton{
UIButton * nextButton = [UIButton buttonWithType:UIButtonTypeSystem];
nextButton.frame = CGRectMake(40, 80, 240, 40);
[nextButton setTitle:@"下一页" forState:UIControlStateNormal];
[nextButton addTarget:self action:@selector(nextPage) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:nextButton];
} - (void)nextPage{
WJJFirstViewController * first = [[WJJFirstViewController alloc] init];
//利用push方法 进入下一个界面 当返回上一个界面的时候 全部界面并不没有了 而是压到栈中
//跟之前present那个跳转界面是不同的
[self.navigationController pushViewController:first animated:YES];
}

在firstViewController中 点击左边按钮能够返回首页 点击右边按钮 进入下一页

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
//在导航控制器的左边、右边自己定义返回键、下一页键
[self createBarButtonItem];
} - (void)createBarButtonItem{ UIButton * popButton = [UIButton buttonWithType:UIButtonTypeSystem];
//假设放在导航栏的左右、自己定义的button跟x、y无关 仅仅跟宽高有关系
popButton.frame = CGRectMake(0, 0, 50, 20);
//设置标题
[popButton setTitle:@"返回" forState:UIControlStateNormal];
[popButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
//以popbutton创建一个自己定义的导航条button
UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithCustomView:popButton];
//让导航栏的返回button 换成我们自己定义的
self.navigationItem.leftBarButtonItem = item; UIButton * pushButton = [UIButton buttonWithType:UIButtonTypeSystem];
//假设放在导航栏的左右、自己定义的button跟x、y无关 仅仅跟宽高有关系
pushButton.frame = CGRectMake(0, 0, 50, 20);
//设置标题
[pushButton setTitle:@"下一页" forState:UIControlStateNormal];
[pushButton addTarget:self action:@selector(nextPage) forControlEvents:UIControlEventTouchUpInside];
//以pushbutton创建一个自己定义的导航条button
UIBarButtonItem * item2 = [[UIBarButtonItem alloc] initWithCustomView:pushButton];
//让导航栏的右边button 换成我们自己定义的
self.navigationItem.rightBarButtonItem = item2; } - (void)nextPage{
WJJSecondViewController * second = [[WJJSecondViewController alloc] init];
[self.navigationController pushViewController:second animated:YES];
} - (void)back{
//pop即是把此视图压到栈里面 让上一个界面显示
[self.navigationController popToRootViewControllerAnimated:YES];
}

然后,在secondViewController中点击button 返回首页

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor grayColor];
[self createToRootButton];
} //新建一个button 点击返回首页
- (void)createToRootButton{
UIButton * toRootButton = [UIButton buttonWithType:UIButtonTypeSystem];
toRootButton.frame = CGRectMake(40, 80, 240, 40);
[toRootButton setTitle:@"首页" forState:UIControlStateNormal];
[toRootButton addTarget:self action:@selector(toRootPage) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:toRootButton];
} //点击按钮 返回到首页 有两种方式
- (void)toRootPage{ //第一种 直接返回到首页
//[self.navigationController popToRootViewControllerAnimated:YES]; //另外一种 由于这些视图控制器是压栈、出栈操作,所以在视图控制器里有一个视图控制器的数组 首页下标为0
[self.navigationController popToViewController:self.navigationController.viewControllers[0] animated:YES]; }

首页

第一个页面

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

第二个页面

Snail—UI学习之导航视图控制器UINavigationController(系统)的更多相关文章

  1. UI 07 _ 导航视图控制器 与 属性传值

    首先, 先创建三个VC. 完毕点击按钮, 进入下一页, 并可以返回. 要先把导航视图控制器创建出来. 在AppDelegate.m 文件里代码例如以下: #import "AppDelega ...

  2. ios 导航视图控制器 跳转

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  3. iOS学习22之视图控制器

    1.自定义视图 1> 概述   定义视图:系统标准UI之外,自己组合而出的新的视图. 定义视图的优点: iOS提供了很多UI组件,借助它们我们可以实现不同的功能.尽管如此,实际开发中,我们还需要 ...

  4. 步步入佳境---UI入门(3) --单视图控制器

    视图控制器特点//1,抽象  视觉上没有效果//2,负责控制视图的显示方式//3,负责通知视图的显示内容//4,ios平台赋予的,收到内存警告和检测设备旋转@interface CHViewContr ...

  5. Snail—UI学习之UITextField

    简单看一下UITextField的属性 - (void)createTextField{ UITextField * textField = [[UITextField alloc] initWith ...

  6. Snail—UI学习之自己定义标签栏UITabBarController

    这里的背景跟上面的差点儿相同 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...

  7. Snail—UI学习之得到某组件的方法

    第一种方法:依据传入函数的參数对象的tag属性区分 比方 多个button运行同一个方法,可是不同的方法运行时.里面的逻辑又不一样 那就得加以区分 这时能够用tag来差别 //再新建一个Button ...

  8. Snail—UI学习之自己定义通知NSNotification

    背景是:一个界面跳转到第二个界面 然后 第一个界面发了一个通知  然后第二个界面收到这个通知后 把里面的数据取出来 在RootViewController.m中写入以下代码 #import " ...

  9. [Xcode 实际操作]三、视图控制器-(4)使用UINavigationController导航栏和工具栏

    目录:[Swift]Xcode实际操作 本文将演示如何显示和隐藏导航视图的导航栏和工具栏 打开第一个视图控制器 import UIKit class FirstSubViewController: U ...

随机推荐

  1. 多任务-进程之Queue的进程间通信

    1.经过线程和进程的对比,不难的知道,线程和进程有相当大的区别,如全局变量资源不能够共享. 2.在不同的进程间,如何实现通信呢? 需要提及的一个概念就是Queue,它是一个消息队列,下面通过一个例子来 ...

  2. iOS开发——AFNetworking基于https的使用

    应公司项目需求,之前的项目使用的http,新项目要求使用https,这篇博客是在AFNetworking框架基于http的基础上修改而来. 1.在开始前,先要把 .crt 文件转成 .cer 文件,然 ...

  3. centos7 jumpserver 部署和使用手册(一)

    测试推荐环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7.2 IP: 192 ...

  4. 虚拟集群LVS及DR模式搭建笔记

    LVS(虚拟集群Linux Virtual Server) LVS-NAT:地址转换,数据包来回都要经过NAT转换,所以Director Server(即LVS服务器)将成为系统瓶颈.使用NAT模式将 ...

  5. nginx proxy_set_header设置,自定义header

    在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了ng ...

  6. C/C++中相对路径与绝对路径以及斜杠与反斜杠的区别

    1 绝对路径与相对路径 绝对路径表示相对容易得多,依次将文件所在盘符文件夹逐级展开就是绝对路径: ofstream infile("E:\\MyDoc\\file.txt", io ...

  7. BZOJ 4236~4247 题解

    BZOJ 4236 JOIOJI f[i][0..2]表示前i个字符中′J′/′O′/′I′的个数 将二元组<f[i][0]−f[i][1],f[i][1]−f[i][2]>扔进map,记 ...

  8. Android与设计模式——单例(Singleton)模式

    概念: java中单例模式是一种常见的设计模式.单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类仅仅能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...

  9. 可能是东半球最全的RxJava使用场景小结

    一.Scheduler线程切换 这样的场景常常会在"后台线程取数据,主线程展示"的模式中看见 Observable.just(1, 2, 3, 4) .subscribeOn(Sc ...

  10. cocos2dx 几个精灵依照顺序播放动画解决方法

    我先描写叙述一下这个问题: 拿之前做的卡牌游戏来说.假设一方场上有3张牌,那么肯定要以一种顺序来播放攻击动画.我是以从左到右的方式. 我的解决方案是向每张牌都传递一个延时參数,然后在runAction ...