一:模拟需求
A界面push到B界面再从B界面push到C界面。
具体:程序一开启:显示A界面,在B界面可以点赞 ,点赞成功与失败都需要“弹框提示用户”, 同时B界面也能push到C界面。
需求.png
二:问题
在B界面点赞之后,还没有“弹框提示用户”时,就“返回”到A界面或者push到C界面,此时,会在A界面或者C界面“弹框提示用户”,体验效果不好。
解决思路:自己的事情自己做,便于后期维护。
1、在A、C界面取消弹框 ==>不推荐
2、在返回 按钮上做文章 ==>不推荐、还会到C界面怎么办?
3、在B界面的delloc方法中 ==>行不通,因为在点击“返回”后,虽然pop出栈了,但是B的View还没有消失,所以代码还是会“弹框提示用户”。并且push到C界面呢?
4、在pop的内部方法removeFromParentViewcontroller方法中操作(当B的控制器彻底从导航控制器中移除时会调用这个方法)==>不是最好,因为有可能是push
5、在B界面中点赞发送网络请求后,接收到服务器返回的数据时做判断==>推荐
三:解决
在发送网络请求后,接收到服务器返回的数据时做判断。
并且:需要一种能在pop回上一个界面和push到下一个界面都能满足需求的方法。怎么判断呢?
首先要知道的一点:如果是B界面push到C界面,那么B界面还是有导航控制器的,并且View不会消失。但是当B界面pop到A界面时,B界面是没有导航控制器的,并且View会等到“弹框提示用户”后,没有强引用引用时才会消失。
1、当导航控制器为nil的时候==>B界面push到C界面时,B界面导航控制器不为nil。
2、当当前控制器不是导航控制器的子控制器==>push到C界面时行不通。B界面push到C界面时,B界面还是导航控制器的子控制器。
3、当导航控制器的第“1”个子控制器是B界面的控制器(A的控制器是第0个)==>推荐
核心代码:[self isEqual:self.navigationController.childViewControllers[1]];
四:不足
需要知道每个控制器的具体下标。
知识点:
1、isEqual 、isEqualToString 、 == 三者的区别:
1> isEqual 是 NSObject 的方法 ,而 isEqualToString 是 NSString 的方法
2> == 比较的是指针指向的地址
3>isEqual是判断两个对象是否相等, == 是判断两个对象是否相同
2、storyboar中能够给不同的控制器绑定同一个控制器(比如给A、B、C界面都绑定VeiwController)但是使用时需要注意:小心报错。
3、pop操作后,界面不一定马上消失。需要等到没有强引用时才有可能销毁,销毁需要时引用计数器为0.
4、pop后没有导航控制器,push之后还有导航控制器。
5、向nil发送消息时不会报错。
网友评论