当前位置: 首页 > news >正文

UINavigation导航控制器的使用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 "【导航控制器】"

导航控制器是用来管多个子控制器,实现不同界面间的"来回切换"


导航控制器显示各个子控制器显示的的原理 

 栈顶原理

 0.导航控制器将所要显示的子控制器放到一个栈中

 1.导航控制器显示的第一个控制器为栈顶控制器(此时栈里面就一个控制器)

 2.返回上一个子控制器时,栈顶控制器的view从导航控制器的view中移除,并且栈顶控制器将被销毁

 3.把最新的栈顶控制器的view显示在导航控制器view的上面

 4.所有的子控制器会存储在导航控制器的viewControllers属性中


UINavigationController以栈的形式保存子控制器

@property(nonatomic,copy)NSArray  *viewControllers;

@property (nonatomic,readonly)NSArray  *childViewControllers;


使用push方法能将某个控制器压入栈

- (void)pushViewController:(UIViewController*)viewController  animated:(BOOL)animated;


使用pop方法可以移除控制器
将栈顶的控制器移除

- (UIViewController*)popViewControllerAnimated:(BOOL)animated;

回到指定的子控制器

- (NSArray*)popToViewController:(UIViewController*)viewController  animated:(BOOL)animated;

回到根控制器(栈底控制器)
-(NSArray*)popToRootViewControllerAnimated:(BOOL)animated;


导航控制器的结构:




导航栏的内容由栈顶控制器的navigationItem属性决定

UINavigationItem有以下属性影响着导航栏的内容
左上角的返回按钮

@property (nonatomic,retain)UIBarButtonItem *backBarButtonItem;

中间的标题视图

@property (nonatomic,retain)UIView          *titleView;

中间的标题文字

@property (nonatomic,copy)  NSString        *title;

左上角的视图

@property (nonatomic,retain)UIBarButtonItem  *leftBarButtonItem;

UIBarButtonItem *rightBarButtonItem 右上角的视图

@property(nonatomic,retain)UIBarButtonItem  *rightBarButtonItem;


代码创建导航控制器:

</pre><pre name="code" class="objc">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //创建窗口,成为主窗口并可见
    UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    window.backgroundColor = [UIColor redColor];
    
    CZOneViewController *oneVc = [[CZOneViewController alloc] init];

    //1.创建导航控制器
    UINavigationController *navContr = [[UINavigationController alloc] initWithRootViewController:oneVc];
    
    //可以通过下面的方法来添加导航控制器第一个显示的控制器
    //UINavigationController *navContr = [[UINavigationController alloc] init];
    //[navContr addChildViewController:oneVc];
    [navContr pushViewController:oneVc animated:NO];
    
    //设置窗口的根控制器为导航控制器
    window.rootViewController = navContr;

    [window makeKeyAndVisible];
    
    self.window = window;
    
    
    return YES;
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


通过storyboard方式创建导航控制器

效果图:



1、Main.storyboard里面默认有一个viewController,删掉,拖一个UINavigationController


拖进来的导航控制器里面默认的跟控制器是一个TableViewController,在这里我们只要一个viewController就行了,于是删掉,拖一个viewController取名字为“第一个控制器”


2、按住ctrl键脱线,设置第一个控制器为导航控制器的根控制器,或者右键点击选中rootViewController脱线

                                                                                           

双击第一个控制器的导航条的中间位置设置导航条的标题为“第一个控制器

或者选中导航条设置导航条的title属性

                


3、同上创建第二个控制器,从第一个控制器向第二个控制器脱线进行跳转(从第一个控制器上面的按钮脱线)


这种方法创建的导航控制器就跟控制器系统给提供导航栏,这就需要我们在第二个以及以后创建的控制器上拖一个导航栏




注意:如果想从第n个控制器返回到第 n - 1 个控制器就不能在脱线了,必须通过代码实现


自定义导航栏的title:

方法一、设置导航栏的titleView属性

方法二、向导航栏的标题位置拖一个UIView

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

什么是Segue

Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue象(简称Segue


每一个Segue对象,都有3个属性

唯一标识

@property (nonatomic,readonly) NSString  *identifier;

来源控制器

@property (nonatomic,readonly) id   sourceViewController;

目标控制器

@property (nonatomic,readonly) id  destinationViewController;


根据Segue的执行(跳转)时刻,Segue可以分为2大类型

自动型:点击某个控件后(比如按钮),自动执行Segue自动完成界面跳转(不需要条件判断的)
(在storyboard上面直接点按钮拖的线都是自动的,只要你点击这个按钮就会自动跳转)

手动型:需要通过写代码手动执行Segue,才能完成界面跳转(需要条件判断是否跳转)
在恰当的时刻,使用perform方法执行对应的Segue

(手动跳转必须点控制器上面的黄色控制器按钮脱线)



[self  performSegueWithIdentifier:@"login2contacts" sender:nil]; // login2contacts就是对应Segue的唯一标识

// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用


接下来研究performSegueWithIdentifier:sender:方法的完整执行过程

[self performSegueWithIdentifier:@“login2contacts”sender:nil];

// 这个self是来源控制器

1.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象
→设置Segue对象的sourceViewController(来源控制器)
→新建并且设置Segue对象的destinationViewController(目标控制器)

2.sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象

- (void)prepareForSegue:(UIStoryboardSegue*)segue  sender:(id)sender;

// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender


3.调用Segue对象的- (void)perform;方法开始执行界面跳转操作
取得sourceViewController所在的UINavigationController
调用UINavigationControllerpush方法将destinationViewController压入栈中,完成跳转




转载于:https://my.oschina.net/yejiexiaobai/blog/800784

相关文章:

  • C#学习基本概念之Tuple类(元组、重数)
  • LINUX用户、用户组及权限管理
  • js 键盘码对应表
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • MyBatis的关联关系 一对一 一对多 多对多
  • iOS—仿微信单击放大图片
  • 内核优化参数
  • webpack搭建前端一条龙服务
  • 敏捷开发Scrum
  • 1.ASP.NET MVC使用EPPlus,导出数据到Excel中
  • redis学习笔记
  • 设计师必看的8个TED 演讲
  • [ solr入门 ] - 利用solrJ进行检索
  • hudson运行出现java.io.IOException Cannot run program的错误分析
  • shell之变量和引用
  • [译] React v16.8: 含有Hooks的版本
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Redis字符串类型内部编码剖析
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Transformer-XL: Unleashing the Potential of Attention Models
  • TypeScript实现数据结构(一)栈,队列,链表
  • 记录一下第一次使用npm
  • 解析带emoji和链接的聊天系统消息
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 小程序01:wepy框架整合iview webapp UI
  • 自动记录MySQL慢查询快照脚本
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (1)(1.11) SiK Radio v2(一)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Python) SOAP Web Service (HTTP POST)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)树状数组
  • (转)一些感悟
  • .aanva
  • .gitattributes 文件
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net多线程总结
  • .NET简谈设计模式之(单件模式)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @Query中countQuery的介绍
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Android Pro] AndroidX重构和映射
  • [Android Studio] 开发Java 程序
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [BZOJ3223]文艺平衡树
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [C++]STL之map
  • [CISCN 2023 初赛]go_session
  • [cocos creator]EditBox,editing-return事件,清空输入框