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

(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

截个图:


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值