iOS-- present和push

present

present方法用于在当前视图控制器上以模态(Modal)方式展示另一个视图控制器。它创建了一个新的视图控制器层级,并在其上显示一个全屏或自定义大小的视图。
这里我具体讲述一下present的模态管理,以下是网上的定义

被present方法呈现的视图控制器采用模态呈现的管理模式。这种管理模式下,被呈现的视图控制器与呈现它的视图控制器之间形成了一种父子关系。被呈现的视图控制器成为了当前视图控制器的子视图控制器(child view controller),由当前视图控制器负责管理。
在模态呈现的管理模式下,被呈现的视图控制器通常具有自己的生命周期,包括viewDidLoad()、viewWillAppear()、viewDidAppear(_:)等方法。同时,被呈现的视图控制器也可以通过委托、回调或其他方式与呈现它的视图控制器进行通信和数据传递。
当用户完成与被呈现的视图控制器的交互后,通常会使用dismiss(animated:completion:)方法将其关闭并返回到呈现它的视图控制器。
总之,通过present方法呈现的视图控制器采用模态呈现的管理模式,它与呈现它的视图控制器形成了父子关系,并由呈现它的视图控制器负责管理。

与present对应使用的是dismiss,返回上一级视图控制器;

#import "firstViewController.h"
#import "secondViewController.h"
@interface firstViewController ()

@end

@implementation firstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = UIColor.greenColor ;
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom] ;
    btn.frame = CGRectMake(100, 300, 100, 40) ;
    [btn setTitle:@"tap" forState:UIControlStateNormal] ;
    [btn addTarget:self action:@selector(presstap) forControlEvents:UIControlEventTouchUpInside]  ;
    [self.view addSubview:btn] ;
}

- (void)presstap {
    [self presentViewController:[[secondViewController alloc] init] animated:YES completion:nil] ;
}
#import "secondViewController.h"

@interface secondViewController ()

@end

@implementation secondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = UIColor.redColor ;
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom] ;
    btn.frame = CGRectMake(100, 300, 100, 40) ;
    [btn setTitle:@"tap" forState:UIControlStateNormal] ;
    [btn addTarget:self action:@selector(presstap) forControlEvents:UIControlEventTouchUpInside]  ;
    [self.view addSubview:btn] ;

}

- (void)presstap {
    [self dismissViewControllerAnimated:YES completion:nil] ;
}

在这里插入图片描述
在这里插入图片描述
present后的视图如果想要的到全屏,可以将viewcontroller对象的属性设为占据整个频幕;
ViewController_01* vc = [[ViewController_01 alloc] init] ;
vc.modalPresentationStyle = UIModalPresentationFullScreen ;

这也可以实现界面的完全切换,和push类似,但和push的堆栈管理不同,present可以随意切换界面,但dismiss只能返回上一级viewcontollrt;push则必须返回rootviewcontroller才能在UItabviewcontroller实现界面切换(在导航控制器中可以以栈的管理方式切换) ;

三种交互模式

1.全push交互:
在UITabBarController下由每个子UINavigationController来push所有的A、B、C页面。在特定场景下如QQ,从其他的任何子ViewController跳转到聊天页面,都需要将当期的UINavigationController pop至Root,再UITabBarController 跳转到第一个UINavigationController,然后再由当期的UINavigationController push至会话页面。

2.全present交互:
如今日头条,使用的就是全present交互,一致的present动画。这样的交互优势是简单,可以适应所有的跳转交互需求(本地交互与远程交互),缺点是用户交互方式单一,当遇到像QQ一样的单一聊天页面需求时,很难实现。

3.主push辅present交互:
主要由push交互,当遇到无其他跳转的页面时可以用present来跳转,例如编辑页面、登录页面。

push

在iOS开发中,"push"是一种用于导航控制器(Navigation Controller)的界面转场方式。当使用导航控制器进行界面跳转时,我们可以通过"push"操作将一个新的视图控制器推入导航堆栈(Navigation Stack),从而实现界面的切换和导航。
与present不同,push的管理模式是堆栈,push就是一种压栈操作,而pop就是弹栈,这也解释了全push交互为何如此 ;
在这里插入图片描述
在这里插入图片描述

#import "firstViewController.h"
#import "secondViewController.h"
@interface firstViewController ()

@end

@implementation firstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = UIColor.greenColor ;
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom] ;
    btn.frame = CGRectMake(100, 300, 100, 40) ;
    [btn setTitle:@"tap" forState:UIControlStateNormal] ;
    [btn addTarget:self action:@selector(presstap) forControlEvents:UIControlEventTouchUpInside]  ;
    [self.view addSubview:btn] ;
}

- (void)presstap {
//    [self presentViewController:[[secondViewController alloc] init] animated:YES completion:nil] ;
    [self.navigationController pushViewController:[[secondViewController alloc] init] animated:YES] ;
}
/*
#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
#import "secondViewController.h"

@interface secondViewController ()

@end

@implementation secondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = UIColor.redColor ;
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom] ;
    btn.frame = CGRectMake(100, 300, 100, 40) ;
    [btn setTitle:@"tap" forState:UIControlStateNormal] ;
    [btn addTarget:self action:@selector(presstap) forControlEvents:UIControlEventTouchUpInside]  ;
    [self.view addSubview:btn] ;

}

- (void)presstap {
    [self.navigationController popViewControllerAnimated:YES] ;
//    [self.navigationController popToViewController: animated:<#(BOOL)#>] ;
//    [self.navigationController popToRootViewControllerAnimated:YES] ;
}
/*
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值