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

ShaCTGQ 7年前
   <p>在之前写聊天项目的时候遇到了这个问题,在微信中我们可以: 从联系人界面跳到详情页面再发起聊天,在聊天界面返回时返回到消息列表界面</p>    <p>这个问题困扰了我很久,这和项目的结构有关,在最初我们的项目结构是如下图这样的:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/673d3ee92fecf857c9d64eeb4e8b0114.png"></p>    <p>这样我们的每一个VC都有自己的导航,经过各种实验,在这情况下,从tabbarController的一个VC跳出去,再跳回tabbarController的另一个VC显然是不行的(主要是右滑返回很难做到)</p>    <p>所有我就思考,在tabbarController上再加一个导航,平时用VC自己的导航做跳转,在通过联系人详情页跳到聊天界面时用tabbarController的导航做跳转,这样就可以做到微信中的跳转逻辑了,就像下图这样的结构:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bc0bc612e29edd8a0ca222137fc3deff.png"></p>    <p>通过这种方式有个缺点,我们需要管理2个导航,而且在使用外层的导航做跳转时,跳转动画也和原生的导航跳转动画不一样。这也是我项目中目前使用的方法,当时使用这种方法实现之后也没有多想,以至于后来遇到了很多坑,这里也不多说了</p>    <p>最近我才想到其实我们可以吧VC的导航去掉,全部使用tabbarController的导航做跳转,这样就会简单很多,而且会避免很多坑,就像下图这种结构:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/674590935a75b2ed32b4f63ee0fe0998.png"></p>    <p>这种结构的实现我没有用在实际项目中,主要是我原来的项目改起来很麻烦,我就懒得改了,我这里写了一个Demo测试了一下,效果很好,所以写这篇文章来记录一下,如果你还有更好的实现的方式,可以在下面留言,我在这里先谢谢了</p>    <ol>     <li>首先创建一个UITabBarController的子类 <pre>  <code class="language-objectivec">// 将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;  }</code></pre> </li>     <li>注意这时在TabBarController中的VC的导航的标题的设置方式发生了改变,我们需要通过下面的方法设置title <pre>  <code class="language-objectivec">// 设置标题  -(void)viewWillAppear:(BOOL)animated{   [super viewWillAppear:animated];   // 这里取到TabBarController,再设置它的标题   [ViewController sharedInstance].title = @"消息";  }</code></pre> </li>     <li>跳转到聊天界面代码 <pre>  <code class="language-objectivec">-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{   CCDetailViewController *DVC = [[CCDetailViewController alloc]init];   [self.navigationController pushViewController:DVC animated:YES];  }</code></pre> </li>     <li>在聊天界面中 <pre>  <code class="language-objectivec">// 视图呈现完成时  -(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];  }</code></pre> </li>    </ol>    <p> </p>    <p>来自:http://www.jianshu.com/p/2a7b69d510c9</p>    <p> </p>