微信 UI 中 tabbar 和 navigation 之间的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tunnyios
V2EX    iOS

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

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

    创建一个tabbarController的主界面,childControllers为 ViewController1、ViewController2,如何在ViewControler2里面的某一个界面中点击一个按钮 让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     Solana     2691 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:21 PVG 15:21 LAX 00:21 JFK 03:21
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86