iOS - 仿微信界面的跳转逻辑

2,474 阅读2分钟
原文链接: www.jianshu.com

在之前写聊天项目的时候遇到了这个问题,在微信中我们可以:从联系人界面跳到详情页面再发起聊天,在聊天界面返回时返回到消息列表界面
这个问题困扰了我很久,这和项目的结构有关,在最初我们的项目结构是如下图这样的:


这样我们的每一个VC都有自己的导航,经过各种实验,在这情况下,从tabbarController的一个VC跳出去,再跳回tabbarController的另一个VC显然是不行的(主要是右滑返回很难做到)
所有我就思考,在tabbarController上再加一个导航,平时用VC自己的导航做跳转,在通过联系人详情页跳到聊天界面时用tabbarController的导航做跳转,这样就可以做到微信中的跳转逻辑了,就像下图这样的结构:


通过这种方式有个缺点,我们需要管理2个导航,而且在使用外层的导航做跳转时,跳转动画也和原生的导航跳转动画不一样。这也是我项目中目前使用的方法,当时使用这种方法实现之后也没有多想,以至于后来遇到了很多坑,这里也不多说了
最近我才想到其实我们可以吧VC的导航去掉,全部使用tabbarController的导航做跳转,这样就会简单很多,而且会避免很多坑,就像下图这种结构:


这种结构的实现我没有用在实际项目中,主要是我原来的项目改起来很麻烦,我就懒得改了,我这里写了一个Demo测试了一下,效果很好,所以写这篇文章来记录一下,如果你还有更好的实现的方式,可以在下面留言,我在这里先谢谢了

  1. 首先创建一个UITabBarController的子类
    // 将TabBarController写成单例类,因为我们需要全局取到它,并设置它的选中VC
    static ViewController *shareInstance = nil;
    +(ViewController *)sharedInstance{
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         if (shareInstance == nil) {
             shareInstance = [[ViewController alloc]init];
         }
     });
     return shareInstance;
    }
  2. 注意这时在TabBarController中的VC的导航的标题的设置方式发生了改变,我们需要通过下面的方法设置title
    // 设置标题
    -(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
     // 这里取到TabBarController,再设置它的标题
     [ViewController sharedInstance].title = @"消息";
    }
  3. 跳转到聊天界面代码
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     CCDetailViewController *DVC = [[CCDetailViewController alloc]init];
     [self.navigationController pushViewController:DVC animated:YES];
    }
  4. 在聊天界面中
    // 视图呈现完成时
    -(void)viewDidAppear:(BOOL)animated{
     [super viewDidAppear:animated];
     // 让TabBarController选中消息列表界面
     [[ViewController sharedInstance] setSelectedIndex:0];
     // 清除导航栈中的VC,并加入tabbarController和聊天界面,这样在右滑手势时也可直接回到消息列表界面
     [self.navigationController setViewControllers:@[[ViewController sharedInstance],self]];
    }
    // 返回按钮点击事件
    -(void)backClick:(UIButton *)btn{
     [self.navigationController popToRootViewControllerAnimated:YES];
    }

附上Demo的地址github.com/cdcyd/Commo…