iOS-界面跳转以及返回

1、在刚开始学习iOS的时候,我们实现界面的跳转还是比较简单的,直接通过

ViewController *root=[[ViewController alloc]init];

[[UIApplication  sharedApplication].delegatewindow].rootViewController = root;

来随意的改变window的根视图控制器。

2、中间突出一些效果,还可以使用

[self presentViewController:  animated:  completion:];

进行模态弹出一个试图控制器,这个试图控制器上不能在进行模态弹出界面,也不能在其上创建试图控制器了。

3、到后来慢慢学习了导航控制器之后,做项目都开始使用push和pop进行界面的进出栈,这时一旦设定根视图控制器,就不能再去改变了。一般来说我们都会在开始创建一个BaseViewController或者BaseNavigationController来作为window的根视图控制,这样以后创建的试图控制器都继承此视图控制器来建立,我们实现界面跳转就是不停的进出栈(现在大多数都是使用导航控制器吧)。我之前也有一个iOS老大,他在项目刚进来时的ViewController上的view作为根视图,之后的所有view都是以此为基础,来不断的进行添加、移除操作,包括底部的tabbar都是使用view来写的,我很佩服他,但是我个人使用不习惯,通过枚举值随意的进行视图的切换。对于导航控制器,其实也可以那样的实现,它的几种常用方法如下:

- (instancetype)initWithNavigationBarClass:(nullable Class)navigationBarClass toolbarClass:(nullable Class)toolbarClass NS_AVAILABLE_IOS(5_0);


- (instancetype)initWithRootViewController:(UIViewController *)rootViewController;// Convenience method pushes the root view controller without animation.


- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;// Uses a horizontal slide transition. Has no effect if the view controller is already in the stack.


- (nullableUIViewController *)popViewControllerAnimated:(BOOL)animated;// Returns the popped controller.


- (nullableNSArray<__kindofUIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;// Pops view controllers until the one specified is on top. Returns the popped controllers.


- (nullableNSArray<__kindofUIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;// Pops until there's only a single view controller left on the stack. Returns the popped controllers.
//(3)此方法常用,直接跳转到想要去的界面
    // popToViewController: animated:出栈,直到指定的视图控制器栈在最上层;返回值为 被出栈的视图控制器 构成的数组
    //找到导航控制器中的这个视图控制器  ;注意:不能新建一个,因为新建的不是导航控制器中本来的那个 ;
    
    //找到导航控制器中当前所有的视图控制器;.viewControllers
    NSArray *viewController=self.navigationController.viewControllers;
    //UIViewController *vc=[viewController objectAtIndex:1];写法或者如下,和C语言中数组下标一样
    //从数组中找到 你想返回的视图控制器;索引:从0开始
    UIViewController *vc=viewController[1];
    [self.navigationController popToViewController:vc animated:YES];

//注意:不要在viewDidLoad中赋值;因为使用导航返回时 viewDidLoad不会被调用

-(void)viewWillAppear:(BOOL)animated
{
    _qqTF.text = _receiveName ;
    _passWordTF.text = _receivePass ;
}

当我们新建一个界面时,可以使用pushViewController:方法;当之前创建过我们需要的界面,且本界面又是从之前的界面上创建的,此时我们千万不要再去使用push方法使本界面再push之前的界面,这样你会发现创建的界面返回时就像一个循环一样,不知道谁push了谁。这时我们要用到的就是pop到指定界面(前提是本界面是从指定界面上push过来的)

for (UIViewController *controller in self.navigationController.viewControllers){
        if ([controller isKindOfClass:[指定试图控制器VC class]]){
            [self.navigationController popToViewController:controller animated:YES];
        }
    }

 

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值