iOS-仿微信界面的跳转逻辑
ShaCTGQ
8年前
<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>