- 最近网络环境比较差,测试APP的时候也出现了一些问题,例如:点击button需要跳转到另一个页面,点一次没反应,多点了几次,结果就连续push好多这个页面。
(BaseNavigationController 继承自UINavigationController,在所有使用导航栏的地方都使用BaseNavigationController,像修改返回按钮的样式,文字只需要在BaseNavigationController中进行修改,所有的地方都会被修改) - 最后解决了这个问题,在这里记录下,如有。
//在viewDidLoad中添加实现UINavigationControllerDelegate
-(void)viewDidLoad
{
[super viewDidLoad];
__weak BaseNavigationController *weakSelf = self;
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.delegate = weakSelf;
self.delegate = weakSelf;
}
}
- 实现协议方法
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//这个方法是在当前控制器执行push的时候,禁止手势右划返回,避免出现crash的现象,(也可以不实现好像也没什么影响)
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled = NO;
}
//判断上一个控制器和现在的控制器是不是同一个,如果是,返回。如果不是push到当前控制器,这就有效避免了同一个控制器连续push的问题
if ([self.topViewController isMemberOfClass:[viewController class]]) {
return;
}
[super pushViewController:viewController animated:animated];
}
- 如果实现了刚才的协议方法,禁止右划返回,就应该实现下面的协议方法,在控制器已经出现的时候,将右划返回打开。
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animate
{
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled = YES;
}
}
希望能有帮助,看的懂。
网友评论
2.在viewWillAppear和viewDidLoad 中初始化值为pushOnce =1;
3.给push穿件外套,别让他裸奔
if(self.pushOnce == 1){
[self.navigationController pushViewController:detailVC animated:YES];
self.pushOnce =0;
}
我的问题解决了。
内存地址这个好像也不太好,总不可能一只保留VC的引用吧
应该比较内存地址
1.Protocol 让所有VC实现没实现的就算不同(事实上一般地址也会不同)
2.重写isEqual 判断Class + 业务数据(Class + 商品ID)
3.UIViewController的Category 这个方法避免了Protocol的不足(无法让所有VC实现,这不现实),可以摆脱isEqual的限制随意发挥