IOS的控制器

控制器简单来说,就是用来做界面跳转的,类似于 Android 的Intent

1.创建一个控制器

 1 控制器的常见的创建方式
 2
 3 1)通过storyboard创建
 4
 5 //直接创建
 6 NJViewController *nj = [[NJViewController alloc]init];
 7
 8 //指定xib文件
 9 NJViewcontroller *nj = [[NJViewController alloc]
10 initWithNibName:@"NJViewController" bundle:nil];
11
12 //先加载storyboard文件(Test是stroyboard的文件名)
13 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
14
15 接着初始化storyboard中的控制器
16 初始化"初始控制器"(箭头所指的控制器)
17 NJViewController *nj = [storyboard instantiateInitialViewController];
18
19 通过一个标识初始化对应的控制器
20 NJViewController *nj=[storyboard instantiateViewControllerWithIdentifier:@"nj"];

MJViewController的view的创建图

控制器的加载

1 1.控制器的view是延迟加载的,用到时再加载
2 2.可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
3 3.控制器的view加载完毕就会调用viewDidLoad方法

多控制器

 1 1.一个ios的app很少只由一个控制器组成,除非这个app极其简单
 2 2.当app中有多个控制器的时候,我们就需要对这些控制器进行管理
 3 3.有多个view时,可以用一个大得view去管理1个或者多个小view
 4 4.控制器也是如此,用1个控制器去管理其他多个控制器
 5
 6 比如:
 7        用一个控制器A 去管理3个控制器B、C、D 控制器A被称为控制器B、C、D 的"父控制器",控制器 B、C、D  的被称为控制器A的子控制器
 8
 9 为了便于管理控制器,IOS提供了2个比较特殊的控制器
10 UINavigationController
11 UITabBarController

UINavigationController

利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的"设置"应用

UINavigationController的使用步骤

 1 1.初始化UINavigationController
 2 2.设置UIWindow的rootViewController为UINavigationController
 3 3.根据具体情况,通过push方法添加对应个数的子控制器
 4
 5 UINavigationController以栈的形式保存子控制器
 6 @property(nonatomic,copy)NSArray *viewControllers;
 7 @property(nonatomic,readonly)NSArray *childViewControllers;
 8
 9 使用push方法能将某个控制器压入栈
10 -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
11
12 使用pop方法可以移除控制器
13 //将栈顶的控制器移除
14 -(UIViewController *)popViewControllerAnimated:(BOOL)animated;
15 //回到指定的子控制器
16 -(NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
17 //回到根控制器(栈底控制器)
18 -(NSArray *)popToRootViewControolerAnimated:(BOOL) animated;

修改导航栏的内容

 1 导航栏的内容由栈顶控制器的navigationitem属性决定
 2
 3 UINavigationItem有以下属性影响着导航栏的内容
 4 //左上角的返回按钮
 5 @property(nonatomic,retain)UIBarButtonItem *backBarButtonItem;
 6 //中间的标题视图
 7 @property(nonatomic, retain)UIView *titleView;
 8 //中间的标题文字
 9 @property(nonatomic,copy) NSString  *title;
10 //左上角的视图
11 @property(nonatomic,retain)UIBarButtonItem *leftBarButtonItem;
12 //UIBarButtonItem *rightBarButtonItem 右上角的视图
13 @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

Segue

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

Segue的属性

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

1 //唯一标识
2 @property(nonatomic, readonly) NSString *identifier;
3 //来源控制器
4 @property(nonatomic,readonly) id sourceViewController;
5 //目标控制器
6 @property(nonatomic,readonly) id destinationViewController;

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

自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转

手动型:需要通过写代码手动执行Segue,才能完成界面跳转

自动型:

手动型:

performSegueWithldentifier:sender:

利用performSegueWithIdentifier:方法可以执行某个Segue,完成界面跳转

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

[self performSegueWithIdentifier:@"login2contacts" sender:nil];

//这个self是来源控制器

1.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象

设置Segue对象的sourceViewController(来源控制器)

新建并且设置Segue

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

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

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

3.调用Segude对象的-(void)perform;方法开始执行界面跳转操作

取得sourceViewController所在的UINavigationController

调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转

[self performSegueWithIdentifier:@"login2contacts" sender:@"jack"];

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

控制器的数据传递

控制器之间的数据传递主要有两种情况:顺传和逆传

顺传

1 控制器的跳转方向:A-->C
2 数据的传递方向:  A--->C
3 数据的传递方式: 在A的 perpareForSeque:sender 方法中根据segue参数取得destinationViewController,也就是控制器C,直接给控制器C传递数据
4 (要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)

逆传

1 控制器的跳转方向:A -->C
2 数据的传递方向: C-->A
3 数据的传递方式:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A
时间: 2024-10-13 11:39:29

IOS的控制器的相关文章

iOS tabbar 控制器基本使用

RootViewController *rootVC=[[RootViewController alloc] init] SignInViewController *signVC = [[SignInViewController alloc]init]; //如果在这里指定tabitem标题,则在FirstViewController中指定self.tabBarItem.title则不生效 signVC.title = @"打卡"; UITabBarItem *signItem = [

关于ios导航控制器的知识总结

关于ios导航控制器的知识总结 添加了导航控制器后: 1.每个页面都会有一个顶部导航栏navigationbar和底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏的,而底部工具栏默认是隐藏的. 2.可以通过设置 self.navigationController.toolbarHidden = NO来显示底部工具栏,工具栏中的内容可以通过viewController的toolbarItems来设置,显示的顺序和设置的NSArray中存放的顺序一致,其中每一个数据都一

ios导航控制器UINavigationController,控制器a跳转(push)到b后,b跳转(push)到c,但c后退(pop)进入a

参考:StackOverflow ios导航控制器UINavigationController,控制器a跳转(push)到b后,b跳转(push)到c,但c后退(pop)进入a.在b跳转(push)到c中代码书写如下: UINavigationController *navController = [[self.navigationController retain] autorelease]; [navController popViewControllerAnimated:NO]; View

13.ios之控制器管理

掌握 ?控制器以及view的多种创建方式 ?UINavigationController的简单使用:添加\移除子控制器 ?UINavigationBar内容的设置 ?控制器的生命周期方法 如何创建一个控制器 控制器常见的创建方式有以下几种 通过storyboard创建 直接创建 MJViewController *mj = [[MJViewController alloc] init]; 指定xib文件来创建 MJViewController *mj = [[MJViewController a

IOS视图控制器的生命周期

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=contents 所谓的生命周期,也就是几个函数的调用顺序,这里以用Storyboard来创建一个ViewController为例 然后我们测试如下代码 // // ViewController.m // // Created by huangwenchen on 14/12/26. // Copyright (c) 2014年 huangwenchen. All rights rese

iOS开发——控制器OC篇&UINavigationController&UITabBarController详解

UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationController以栈的形式保存子控制器 @property(nonatomic,copy) NSArray *viewControllers; @property(nonatomic,readonly) NSArray *childViewControllers; 导航控制器之间的跳转: 使用push方法能将某个控制

IOS视图控制器导航及生命周期研究Demo

1.背景: 2014年4月份第一次接触IOS端开发,为某银行开发一款金融app.在开发的最后阶段,加入了需要从任意一个页面直接返回主页的功能.悲催的是,当时没有使用UINavigationController进行导航管理,而是使用了IOS中的模态跳转方式(presentViewController/dismissViewControllerAnimated). 因此需要找的一种方法进行,实现如下方式的导航跳转: 已知: 页面a→页面b→页面c 求解: 页面c直接跳回到页面a,并且要求不能有内存泄

ios – 视图控制器如何管理视图?

移动设备的屏幕有限,所有的东西都需要放到一个单一窗口组成的单一界面显示,在ios中体现为视图切换(在<ios – 视图>中已经说明了视图),当一个视图替换掉另一个视图的时候,会经常使用动画效果,这个任务就是交给视图管理器来完成的. ios5之后应用程序窗口有一个根视图控制器(rootViewController),当不为rootViewController赋值时,会出现"Application windows are expected to have a root view cont

iOS(视图控制器转场)

转场需要提供转场代理,不使用默认的代理则需要自己实现代理方式,有UINavigationController.UITabBarController.UIViewController三种代理,实现以下三种协议<UINavigationControllerDelegate> //push和pop切换 <UITabBarControllerDelegate> //tab切换<UIViewControllerTransitioningDelegate> //UICollecti