迅速pushViewController、popToViewController引起的导航紊乱、崩溃

最近遇到一个导航栏异常相关的问题,问题描述如下:新建一个viewcontroller 然后用导航

pushViewController展示出来,

代码如下:

//群

RCSGroupSettingVC *v = [[RCSGroupSettingVC alloc]initWithGroupID:self.sessionUri];

v.hidesBottomBarWhenPushed = YES;

[self.navigationController pushViewController:v animated:YES];

然后逻辑层有一个模块会向这个节目抛送一个通知,当收到这个通知后,这个节目会迅速从导航中pop出来,

if (type == UI_RCSGroup_groupHasBeenDel)

{

//id<RCSParticipant> group = [param objectForKey:@"param"];

NSString * groupId = [para objectForKey:@"param"];

if ([groupId isEqualToString:_group.ID])

{

NSMutableArray *navigationStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];

if  ([navigationStack containsObject:self])

{

id objc = [(RCSBaseNavigationController *)self.navigationController getViewControllerByClass:[RCSMsgBoxViewController class]];

if (objc)

{

// 消息盒子

[self.navigationController popToViewController:objc animated:NO];

}

}

else{

_bGroupIsDelete = YES;

}

}

return;

}

此时由于pushviewcontroller到导航栏中要进行一下操作,迅速的pop到其他viewcontroller或者popTorootviewcontroller就会引起,导航栏的错乱,或者界面释放后刷新不了,依然展示在导航栏中,再次操作该界面就会引起崩溃。

遇到这种问题的解决方法就是将抛送过来的通知的响应放到viewdidappear中处理,让导航栏的pushviewcontroller处理完,界面展示出来后,所有初始化处理完后,在popToViewcontroller,此时就不会有异常了。

//通知里面设置一个变量,表示要popviewcontroller了

if (type == UI_RCSGroup_groupHasBeenDel)

{

//id<RCSParticipant> group = [param objectForKey:@"param"];

NSString * groupId = [para objectForKey:@"param"];

if ([groupId isEqualToString:_group.ID])

{

_bGroupIsDelete = YES;

}

}

return;

}

//在
viewDidAppear方法中处理popviewcontroller

-(void)viewDidAppear:(BOOL)animated

{

[super viewDidAppear:animated];

if (_bGroupIsDelete)

{

NSMutableArray *navigationStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];

if  ([navigationStack containsObject:self])

{

id objc = [(RCSBaseNavigationController *)self.navigationController getViewControllerByClass:[RCSMsgBoxViewController class]];

if (objc)

{

// 消息盒子

[self.navigationController popToViewController:objc animated:NO];

}

}

}

_bHaveDidAppear = YES;

}

时间: 2024-11-03 21:29:35

迅速pushViewController、popToViewController引起的导航紊乱、崩溃的相关文章

自定义导航栏返回时的滑动手势处理

现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 如果是因为自定义导航按钮而导

IOS视图控制器导航及生命周期研究Demo

1.背景: 2014年4月份第一次接触IOS端开发,为某银行开发一款金融app.在开发的最后阶段,加入了需要从任意一个页面直接返回主页的功能.悲催的是,当时没有使用UINavigationController进行导航管理,而是使用了IOS中的模态跳转方式(presentViewController/dismissViewControllerAnimated). 因此需要找的一种方法进行,实现如下方式的导航跳转: 已知: 页面a→页面b→页面c 求解: 页面c直接跳回到页面a,并且要求不能有内存泄

ios weibo 第二天 设置导航栏属性,添加加号按钮

要点:1.在底部添加加号按钮 2.设置导航栏属性 1.weibo底部的button其中四个按钮是一样的,其中中间的加号需要另外做处理 tablebar是自己定义的 ,代码如下 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 删除系统自动生成的UITabBarButton for (UIView *child in self.tabBar.subviews) { if ([child isKin

iOS 7的手势滑动返回

如今使用默认模板创建的iOS App都支持手势返回功能,假设导航栏的返回button是自己定义的那么则会失效,也能够參考这里手动设置无效. [cpp] view plaincopy if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enab

iOS 7的手势滑动返回功能

现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 如果是因为自定义导航按钮而导

Android API Guides---Action Bar

Action Bar 操作栏是一个窗口功能,可识别用户的位置,并提供用户操作和导航模式.使用操作栏,您的用户在不同应用程序熟悉的界面,该系统正常适应不同的屏幕配置. 图1.一个操作栏,其中包括[1]应用程序图标,[2]两项行动项目,和[3]操作溢出. 操作栏提供了几个关键功能: 提供了应用程序给你的应用的身份,并表示用户位置的专用空间. 使重要行动显明易在可预见的方式(如搜索). 支持应用内一致的导航和查看开关(带标签或下拉列表). 有关操作栏中的互动模式和设计准则的详细信息,请参阅操作栏的设计

iOS--导航栏样式

push返回按钮样式: UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = item; self.navigationController.navigationBar.tintColor = [UIColor gra

整理IOS开发常用小Tips

在NavigationController中 重写 show/pushViewController方法统一在导航栏中添加按钮 - (void)showViewController:(UIViewController *)vc sender:(id)sender { if (self.viewControllers.count > 0) { //首页不显示跳转可以通过只添加leftBtn来间接修改所有返回按钮的图片 vc.hidesBottomBarWhenPushed = YES; vc.nav

使用Visual Studio 2013 从头构建Web表单

在这篇文章中,我将采取VS 2013中特定的模板,也就是没有身份验证的Web表单模板,并说明如何构建这个项目从头开始.在本教程的最后,你会最终有一个模板,内容几乎是一样的使用Web表单模板没有认证(文件>新建项目> ASP.NET Web应用程序(Visual C#中创建一个新的VS 2013项目)> Web窗体>无身份验证). 步骤来创建Web窗体(无验证)项目从头开始 1.新建空项目 我们先从最简单的网页模板:打开Visual Studio,文件>新建项目> ASP