IOS开发入门基础(四):导航控制器的详解及其运用(1)

一、导航控制器的类结构

导航视图控制器是视图控制器(UIViewController)的一个子类,而在导航视图控制下面还有两个子类控制器,UIImagePickerController和UIVideoEditorController。

IOS开发入门基础(四):导航控制器的详解及其运用(1)

二、导航控制器的组成

如下图所示,一个导航视图控制器由3个部分组成,NavigationBar、Custom content和Navigation toolbar。

IOS开发入门基础(四):导航控制器的详解及其运用(1)

更直观一点的表示如下图所示。

IOS开发入门基础(四):导航控制器的详解及其运用(1)

1) NavigationBar主要是用来负责视图之间的切换,比如弹出下一级的视图;还可以用来控制和管理主视图。它位于整个导航视图控制器的最上方。

2) Custom content是用来显示内容的视图,自定义视图的内容将会在这里显示。

3) Navigation toolbar是导航控制器的辅助工具栏视图,它默认是隐藏的,需要时可以将它显示。它的作用就是添加了一些特定的功能供用户使用,比如说iPhone中常见的微博分享功能等等。

三、导航控制器管理视图模式

导航控制器只是一个容器,需要将相应的视图加入到导航控制器中,这些视图都是导航控制器的子视图。

导航视图控制器管理视图是以栈的形式来实现的。将导航视图控制器当做一个栈,将一个视图添加到导航视图控制器中的操作叫做入栈(push),从栈中删除一个视图的操作叫做出栈(pop)。栈的特点是"先进后出",或者说是"后进先出",这是什么意思呢?就是说最先添加进来的视图,如果要删除的话,必须等后面的视图全部删除完毕了,它才能得到删除;同样地道理,最后添加进来的视图必须是第一个删除的对象。

四、导航控制器的特点

1、UINavigationController 是一个根控制器,和 UITabBarController 一样,是一个导航控制容器,本身不会显示视图。要想显示视图,必须指定一个视图。前面说的压栈操作。所有的视图都是 UINaviagtionController 的子视图

2、在子视图中可以通过navigationController访问导航控制器,同时可以通过navigationController的childViewControllers获得当前栈中所有的子视图(注意每一个出栈的子视图都会被销毁)。

3、UINavigationController导航是通过上方导航栏进行的(类似的UITabBarController是通过下方UITabBar进行导航),每个放到UINavigationController栈中的子视图都会显示一个导航栏,可以通过子控制器(包括根控制器)的navigationItem访问这个导航栏,修改其左右两边的按钮内容。

4、默认情况下除了根控制器之外的其他子控制器左侧都会在导航栏左侧显示返回按钮,点击可以返回上一级视图,同时按钮标题默认为上一级视图的标题,可以通过backBarButtonItem修改。下一级子视图左侧返回按钮上的标题的显示优先级为: 导航栏返回按钮backBarButtonItem的标题(注意不能直接给backBarButtonItem的标题赋值,只能重新给backBarButtonItem赋值)、导航栏navigationItem的标题,视图控制器标题。

5、导航控制器还管理一个导航栏(UINavigationBar)。导航栏类似于工具栏,但它是使用导航项(UINavigationItem)实例填充的,该实例被加入到导航控制器管理的每个场景中。默认情况下,场景的导航项包含一个标题和一个Back按钮。Back按钮是以栏按钮项(UIBarButtonItem)的方式加入到导航项的。

导航项在Attributes inspector面板里有三个可设置属性:Title、Prompt和Back Button

Title -- 导航项的标题

Prompt -- 显示在标题上方的文本,向用户提供使用说明

Back Button -- 下一个场景的后退按钮的文本,假如没有设置,默认显示的文本是标题

在任何场景中,都可通过属性parentViewController来获取导航控制器。

五、导航视图控制的创建

导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面。在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界面,也就是用户看到的界面。

IOS开发入门基础(四):导航控制器的详解及其运用(1)

(1)要把导航控制器加载到APP中,需要把这个导航控制器设置为window的根视图控制器(都是控制器类,可以赋值),这样就相当于加载到了window里。

self.window.rootViewController=navigationController;

(3)要在栈中新增或者删除一个视图控制器,就需要得到导航控制器,一般在栈中得所有视图控制器都有一个self.navigationController,意思是我的导航控制器,也就是这个视图控制器所在的导航控制器,这样就拿到了导航控制器。

(4)栈中新增视图控制器用pushViewController,其实就是push进去一个,这样对于用户而言就是打开一个新界面了。比如打开 SubViewController 视图。

SubViewController *subViewController=[[SubViewController alloc] init];

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

(5)栈中删除一个视图控制器用popViewControllerAnimated,当然这个pop只能pop最上面的那个,对于用户而言相当于从当前视图回到上一级视图。

(6)其实这个push和pop对于用户而言都是打开和跳转页面的一个操作。而pop由更多地操作方法,如一下子pop掉只剩下一个根视图控制器,那么就相当于从好几层直接回到最原始的主页面。也可以指定pop几个,以跳转到指定的页面。

展开阅读全文

页面更新:2024-05-13

标签:主视图   控制器   都会   子类   赋值   视图   容器   详解   工具栏   实例   按钮   入门   文本   操作   标题   基础   内容   用户   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top