以前一直有个很疑惑的问题没有搞清楚

关于ios中 viewcontroller的跳转问题,其中有一种方式是采用navigationController pushViewController 的方法,比如我从主页面跳转到了一级页面,又从一级页面跳转到了二级页面,然后从二级页面跳转到了三级页面,依次类推。,如果一级一级的返回我知道是没有问题的,调用navigationController popViewControllerAnimated就行了。。但是某些情况下我可能想要马上回到主页面,而不是一级一级的返回(如果有很多层会很累的),那该怎么办呢?

不是点击返回,点击指定btn返回到指定界面

1.返回根页面vc用 :

[self.navigationController popToRootViewController]

2.返回指定的某个vc用下面(通过index定位)

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

            if let index = self.navigationController?.viewControllers.index(of: self) {
self.navigationController?.viewControllers.remove(at: index)
}

  

3.(通过class定位),当前控制器有这个控制器存在

for (UIViewController *controller in self.navigationController.viewControllers) {

  if ([controller isKindOfClass:[你要跳转到的Controller class]]) {

    [self.navigationController popToViewController:controller animated:YES];

    }

}

重点 点击返回pop到指定控制器,当前控制器可能根本就没创建过,或者返回顺序和之前进来的顺序完全不一致,下面1代表根控制器

1.重构当行控制器viewControllers顺序 :需注意一个事项,没有的vc(根本就不存在的vc,不是push的vc,)一定要重写下面的返回,因为Vc创建的时候根本不是push进来的,目前这个方法可以解决xib,sb,纯代码创建的VC

vc.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)

1.1简单型 push顺序本来是 1234,返回顺序425631,需要在第3push第4时候,重构顺序

  因为vc5, vc6 不存在 所以需要加上代码
  vc5.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil)
  vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
  let newViewController: [UIViewController] = [vc4 , vc2, vc5, vc4, vc3, vc2, vc1]
  self?.navigationController?.setViewControllers(newViewController, animated: true)

  

1.2变态复杂性 push顺序123,返回顺序 341(在2push的地方重构viewControllers),但是在第3push到4的时候,返回顺序变了469231(在3push的地方再次重构顺序),第4push到第5的时候,返回变成了5283671(在4push的地方需要再次重构顺序)

  在界面2需要重构 , 因为vc4 不存在 所以需要加上代码
  vc4.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
  let newViewController: [UIViewController] = [vc3 , vc4, vc1]
  self?.navigationController?.setViewControllers(newViewController, animated: true)

  在界面3需要重构 , 因为vc6,9 不存在 所以需要加上代码
  vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
  vc9.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
  let newViewController: [UIViewController] = [vc4, vc6, vc9, vc2, vc3,vc1]
  self?.navigationController?.setViewControllers(newViewController, animated: true)

  

1.3没有人性型, 和1.2一样,但是3这个界面有各个界面push进来,返回的时候多个界面需要重构。。。

例如:俩简单的,1根控制器,123->3961, 4532->23694

let controllers = self.navigationController.viewControllers

  for v in controllers{
    
    //123->3691
    if v is vc2(vc2是类名字), controllers.count == 2{
      let vc6 = vc6()
      vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
      let vc9 = vc9()
      vc9.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
      let newViewController: [UIViewController] = [vc3, vc9, vc6, vc1]
      self?.navigationController?.setViewControllers(newViewController, animated: true)
    }else{
      self?.navigationController?.setViewControllers(newViewController, animated: true)
    }     //4532->23694    
    if v is vc4(vc4是类名字),vc.count ==2{       
      let vc6 = vc6()
      vc6.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
      let vc9 = vc9()
      vc9.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回或者("<" 或 "指定的返回图片" 或 "文字)", style: .plain, target: self, action: nil) 
      let newViewController: [UIViewController] = [vc4, vc9, vc6, vc3]
      self?.navigationController?.setViewControllers(newViewController, animated: true)
    }else{
      self?.navigationController?.setViewControllers(newViewController, animated: true)
    }
   }

  

iOS - push 或 pop或点击导航栏返回pop指定导航控制器的更多相关文章

  1. Ios导航栏返回到指定的页面

    在自己的项目实现中有这样的一个需求.一般情况下我们的导航栏返回按钮,是上个页面跳转过来,点击返回按钮返回到上来界面.但是在实际需求中有的并不是这么简单的.有的界面返回是只确定的界面.所以当时自己在实现 ...

  2. iOS 导航栏返回到指定页面的方法和理解

    关于ios中 viewcontroller的跳转问题,其中有一种方式是采用navigationController pushViewController 的方法,比如我从主页面跳转到了一级页面,又从一 ...

  3. 转载 iOS拦截导航栏返回按钮事件的正确方式

    原文链接:http://www.jianshu.com/p/25fd027916fa 当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮 ...

  4. iOS拦截导航栏返回按钮事件的正确方式

    当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...

  5. iOS拦截导航栏返回按钮事件的正确方式(二)

    当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...

  6. IOS 改变导航栏返回按钮的标题

    IOS 改变导航栏返回按钮的标题   下午又找到了一个新的方法 这个方法不错 暂时没有发现异常的地方. 新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一 ...

  7. ios 修改导航栏返回按钮的图片

    修改导航栏返回按钮的图片 方法1: [UINavigationBar appearance].backIndicatorTransitionMaskImage = [UIImage imageName ...

  8. ios开发之--iOS 11适配:iOS11导航栏返回偏移

    UIBarButtonItem 左边间隙过大,解决方案(ios11之前): 调用下面的方法,设置negativeSpacer.width = -15;就可以解决间隙过大的问题: UIBarButton ...

  9. iOS侧滑返回到隐藏导航栏的VC,导航栏会闪现一次

    VCA:是一个隐藏导航栏的页面:VCA在ViewWillAppear生命周期函数中设置导航栏隐藏: //隐藏导航栏 [self.navigationController setNavigationBa ...

随机推荐

  1. [UE4]蓝图重构

    假设现在有一个蓝图类BP_GunRife(已经有其它很多类在使用这个类),现在要增加另外一把枪BP_BunLauncher. 可以新建一个父类BP_Gun,让BP_GunRife和BP_BunLaun ...

  2. PHP实现微信申请退款(证书权限必须设为可执行)

    前期准备: 当然是搞定了微信支付,不然怎么退款,这次还是使用官方的demo.当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,原因如下: (1)可能功能不全,或许 ...

  3. Java 泛型小结

    1.什么是泛型? 泛型(Generics )是把类型参数化,运用于类.接口.方法中,可以通过执行泛型类型调用 分配一个类型,将用分配的具体类型替换泛型类型.然后,所分配的类型将用于限制容器内使用的值, ...

  4. TensorFlow利用A3C算法训练智能体玩CartPole游戏

    本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...

  5. python之路之装饰器

    一 装饰器进化之路1) import time def index(): start_time=time.time() time.sleep() print('welcome to index wor ...

  6. 跳表(skiplist)Python实现

    # coding=utf-8 # 跳表的Python实现 import random # 最高层数设置为4 MAX_LEVEL = 4 def randomLevel(): ""& ...

  7. 并发基础(三) java线程优先级

      在不同的JVM中(JVM也算是一个操作系统),有着不同的CPU调度算法,对于大部分的JVM来说,优先级也是调度算法中的一个参数.所以,线程优先级在一定程度上,对线程的调度执行顺序有所影响,但不能用 ...

  8. OpenACC Hello World

    ▶ 在 windows 10 上搭建 OpenACC 环境,挺麻烦 ● 安装顺序:Visual Studio 2015(PGI 编译器不支持 Visual Studio 2017):CUDA Tool ...

  9. MYSQL三大范式

    第一范式:确保每列的原子性. 第一范式是最基本的范式. 数据库表中的字段都是单一属性的,不可再分. 只要是关系数据库都满足第一范式 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子 ...

  10. vue基础——组件基础

    一.基本示例 这里有一个Vue组件的示例: // 定义一个名为 button-counter 的新组件 main.js Vue.component('button-counter', { data: ...