您的位置:首页 > 产品设计 > UI/UE

【iOS开发-20】UIViewCOntroller视图控制器之间跳转切换举例,以及视图控制器生命周期的简单说明

2014-09-27 23:33 681 查看
(1)视图控制图可以理解成有两部分,有一个部分是控制的,还有一部分是视图,比如我们在ViewController类里面写得self相当于视图控制器,而self.view相当于是视图控制器的视图。视图控制器默认是从(0,0)位置开始的,背景是透明的。

(2)视图控制器之间的切换方式之一是,presentViewController和dismissViewControllerAnimated,也就是类似于”点击进入下一层,返回进入上一层“这种调转切换,前一个方法类似于在就窗口上打开一个新的,后一个方法类似于关闭当前窗口返回去。

(3)UIViewController的生命周期,也就是加载、呈现、退出等等一些过程。下图显示的比较清楚。需要说明的是,在本例中两个UIViewController之间切换,执行的方法顺序是:第一个的viewWillDisappear >>> 第二个的viewWillAppear >>> 第二个的viewDidAppear >>> 第一个的viewDidDisappear。

(4)如果只知道一个方法的一部分,而且是中间的部分(字符单词),如何找出这个方法?“CMD+点击”这个类,一直追朔到这个类的系统类,如UIViewController类,然后进去按CMD+F查找,输入我们知道的那部分单词,很快就找到。



以下是ViewController.m的代码:

#import "ViewController.h"
#import "SubViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
//self是试图控制器,视图控制器的背景颜色
self.view.backgroundColor=[UIColor orangeColor];
//查看试图控制器位置和大小,x和y都是0,在状态栏下面,所以布局时需要考虑状态栏
NSLog(@"%f,%f,%f,%f",self.view.frame.origin.x,self.view.frame.origin.y,self.view.frame.size.width,self.view.frame.size.height);

//新建一个视图控制器类,点击按钮后从本类调转到新建的那个类中,然后再点击一个按钮返回,即从一个view调转到另一个view
//新建了一个SubViewController,继承自ViewController
//以下是一个按钮,点击后跳转到SubViewController的那个视图
UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
btn1.frame=CGRectMake(10, 30, 300, 30);
btn1.backgroundColor=[UIColor whiteColor];
[btn1 setTitle:@"跳转" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(jumpTo) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1];

// Do any additional setup after loading the view, typically from a nib.
}
//跳转,其实就是打开一个模式对话窗口,所以是present,相当于在本视图控制器上呈现子视图控制器,所以所谓返回,就是关闭这个窗口,而不是子视图控制器中再打开本视图控制器,那就乱套了
//这个适合点击进去,然后有返回按钮的视图之间的跳转
-(void)jumpTo{
//这里因为是每次点击按钮会重新实例化一个子视图控制器,所以每次进入这个子视图控制器都是新的,所以都需要进入子视图控制器的loadView和viewDidLoad
//改进是先设置为全局变量SubViewController *subvc1;
//然后在viewDidLoad中实例初始化,不要在此处。所以下面的一句话删除即可
SubViewController *subvc1=[[SubViewController alloc]init];
//这个视图控制器之间的跳转动画,可以设置,一共四种
//如果你只知道某一个方法的一部分字符,可以“CMD+点击”到这个类里面去,然后CMD+F查找,基本可以解决问题
//UIModalTransitionStyleCoverVertical-默认的,从下来,往下去
//UIModalTransitionStyleCrossDissolve-渐变出现和消失
//UIModalTransitionStyleFlipHorizontal-水平翻转,翻转时可看到底色
//UIModalTransitionStylePartialCurl-翻书效果,早期版本翻书后会留个尾巴遮住部分视图,新版本中不会遮住,翻完不留东西在视图中
subvc1.modalTransitionStyle=UIModalTransitionStylePartialCurl;
[self presentViewController:subvc1 animated:YES completion:^{

}];
}
//每次检查内存中又没有view,没有就loadView然后viewDidLoad,然后进入viewWillAppear,否则直接进入viewWillAppear,一般第二次运行就是
-(void)loadView{
[super loadView];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
}
//以下方法由系统自动调用,不可手动写
//-(void)viewDidUnload{
//
//}
//在进入程序时候如果有低内存警告,我们一般是删除一些视图释放一些内存
//如果已经切换或者关闭视图即viewDidDisappear后由低内存警告,则一般系统会执行viewDidUnload,那么下次我们再运行时,内存中就没有view,则需要再次经过loadView和viewDidLoad后进入viewWillAppear
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

以下是SubViewController.m的代码:

#import "SubViewController.h"
#import "ViewController.h"

@interface SubViewController ()

@end

@implementation SubViewController

- (void)viewDidLoad {
[super viewDidLoad];
//在子视图控制器中设置一个按钮,用来点击返回主视图控制器
UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
btn1.frame=CGRectMake(10, 30, 300, 30);
btn1.backgroundColor=[UIColor whiteColor];
[btn1 setTitle:@"返回" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(backTo) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1];
self.view.backgroundColor=[UIColor purpleColor];
// Do any additional setup after loading the view.
}

-(void)backTo{
//用dismissViewControllerAnimated解除关闭这个模式对话窗口即相当于跳转返回
[self dismissViewControllerAnimated:YES completion:^{

}];
//以下方式是打开新的模式对话窗口的形式来跳转,这样的跳转其实不是返回,而只是打开一个新的,不建议这么做
//ViewController *mainvc=[[ViewController alloc]init];
//[self presentViewController:mainvc animated:YES completion:^{
//
//}];
}

-(void)loadView{
[super loadView];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
}

- (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


截个图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐