iOS - push 或 pop或点击导航栏返回pop指定导航控制器

时间:2022-09-12 16:52:19

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

关于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拦截导航栏返回按钮事件的正确方式&lpar;二&rpar;

    当我们使用了系统的导航栏时,默认点击返回按钮是 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. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  2. RabbitMQ 开启WEB管理

    rabbitmq-plugins 插件管理器 1.开启rabbitmq management  -  WEB管理插件 # rabbitmq-plugins enable rabbitmq_manage ...

  3. Windows Server 2008 下ASP程序连接ORACLE数据库驱动错误

    今天开发那边升级.改造系统过程中,在测试服务器碰到关于ASP程序连接ORACLE数据库的小问题,虽然是小问题,但是整起来真要命啊,花了不少时间,主要是ASP程序啊,这种上古神器,哥还是当年毕业的时候弄 ...

  4. ActiveMQ&lpar;5&period;10&period;0&rpar; - Destination-level authorization

    To build upon authentication, consider a use case requiring more fine-grained control over clients t ...

  5. oracle 通过查询灵活插入数据 insert into &period;&period;&period;select&period;&period;

    insert into reg_user (id,name,password,area_code,reg_time,first_pswd,record_type) select l.reg_user_ ...

  6. webpack 打包测试和生产多个版本

    cross-env修改生产环境变量 npm i --save-dev cross-env 在package.json里这么配置 npm run build就是打包到生产环境 npm run build ...

  7. Epoll模型【转】

    转自:https://www.cnblogs.com/tianhangzhang/p/5295972.html 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率.因为 ...

  8. css 进度条

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. c&num;基础学习&lpar;0806&rpar;之接口学习

    首先了解一下什么是接口: 1.接口就是一种规范,协议,约定好遵守某种规范就可以写通用的代码 2.定义了一组具有各种功能的方法(只是一种能力,没有具体实现,像抽象方法一样,“关说不做”) 接口存在的意义 ...

  10. PHP 表单 - 5(完整表单实例)

    PHP 完整表单实例 本章节将介绍如何让用户在点击"提交(submit)"按钮提交数据前保证所有字段正确输入. PHP - 在表单中确保输入值 在用户点击提交按钮后,为确保字段值是 ...