V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tunnyios
V2EX  ›  iOS

微信 UI 中 tabbar 和 navigation 之间的问题

  •  
  •   tunnyios · 2015-07-16 01:05:49 +08:00 · 2769 次点击
    这是一个创建于 3209 天前的主题,其中的信息可能已经有所发展或是发生改变。
    PS:更好的排版可以看这里: http://tunnyios.github.io/personal/tabBar_Nav/#section-4

    创建一个tabbarController的主界面,childControllers为 ViewController1、ViewController2,如何在ViewController2里面的某一个界面中点击一个按钮 让ViewController2 push到下一个界面 并且让界面显示为该界面。

    更形象的例子:可参考微信,在微信界面点击进入聊天框;在通讯录界面,点击相应联系人,然后点击发送消息,进入聊天框。两个方式进入聊天框 左上角的返回键 都是返回tabbar的主界面。

    废话不多说直接上核心代码:其实也就是只有一段,就是监听消息按钮的点击事件,做相应的处理。在这里遇到了点问题,一会儿说。

    问题代码
    -(IBAction)sendMessage
    {
    //将当前控制器弹出栈
    [self.navigationController popToRootViewControllerAnimated:YES];

    //取到storyBoard中对应的控制器
    self.tabBarController.selectedIndex = 0;
    UINavigationController *nav = self.tabBarController.viewControllers[0];

    UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *chatVc = [mainSB instantiateViewControllerWithIdentifier:@"chat"];

    [nav pushViewController:chatVc animated:YES];
    }

    问题效果图
    http://7xke07.com1.z0.glb.clouddn.com/image/tabBar-Nav-error.gif

    原因分析

    大家会看到效果图中,发消息的那个控制器已经pop掉了,但是当点击通讯录tabBarItem时,发消息的那个控制器会一闪而过。

    原因(个人理解):通过pop方法将控制器弹出栈,会销毁当前控制器,但是在同一个方法里先pop了当前的控制器,紧接着又进行了其他的操作(PS:当还在这个控制器的操作没有执行完的时候,在内存中还被持有在内存中时,就不会被销毁!此处只是个别现象,应该具体问题具体分析),导致控制器没有被立刻销毁。之后点击tabBarItem时,才销毁了控制器,因此会一闪而过;

    为什么只有在点击了通讯录tabBarItem时,才会销毁发消息控制器呢?

    原因(个人理解):这个是具体情况,因为tabBarController对应有导航控制器,但是pop后,对应A控制器已经被移出栈顶了,但是没有被销毁,所以还显示着。当点击通讯录tabBarItem时,会显示对应导航控制器的栈顶控制器,此时栈顶控制器是B控制器,但是A控制器还压在B控制器上,因此tabBar要显示控制器B,系统会发现A已经不在栈中了,然后销毁了A控制器…

    修改后的代码
    -(IBAction)sendMessage
    {
    //取到storyBoard中对应的控制器
    self.tabBarController.selectedIndex = 0;
    UINavigationController *nav = self.tabBarController.viewControllers[0];

    UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *chatVc = [mainSB instantiateViewControllerWithIdentifier:@"chat"];

    [nav pushViewController:chatVc animated:YES];

    //注意此处:仅仅是将位置换了一下
    [self.navigationController popToRootViewControllerAnimated:YES];
    }

    效果图演示
    http://7xke07.com1.z0.glb.clouddn.com/image/tabBar-Nav-ok.gif

    DEMO代码分享

    链接: http://pan.baidu.com/s/1nttHH7F 密码: zap2
    2 条回复    2015-07-16 01:17:58 +08:00
    gonghao
        1
    gonghao  
       2015-07-16 01:15:09 +08:00
    如果问题代码里,将 `[self.navigationController popToRootViewControllerAnimated:YES]; ` 中的 `YES` 改为 `NO` 呢?
    tunnyios
        2
    tunnyios  
    OP
       2015-07-16 01:17:58 +08:00
    @gonghao 改成NO也一样的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3736 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:20 · PVG 12:20 · LAX 21:20 · JFK 00:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.