iOS使用NavigationController经常出现的问题

情况一:

MyViewController *sampleViewController
= [[[MyViewController alloc]initWithXXX] autorelease];

[self.navigationController pushViewController: sampleViewController animated:true];

BUG:界面无反应

分析可能出错的原因:

1:self.navigationController为nil,空指针执行pushViewController直接跳过,接着sampleViewController会释放掉,所以界面会无反应。

self.navigationController为神马会空呢?navigationController是UIViewController父类继承来的属性,不是随便都能用的,除非你当前viewController是被nav
push进来的,或者用xib/代码做成navigationcontroller的root了,cocoa的代码应该是给赋值了。(题外话,我很多界面就是局部用了某个ViewController,这种情况该viewController的nav为空,如果要正确使用,可以从app取,可以自己赋值,可以整体界面取。。。想咋取都行)

2、self.navigationController为nil,界面挂了

如果你sampleViewController用到了网络异步请求,在initWithXXX的时候会去取数,那么你10有89会挂掉。

原因分析:大家网络请求,经常如下:

TwitterClient *twitterClient = [[TwitterClient alloc] initWithTarget:self action:@selector(XXXReceive:obj:)];

[twitterClient getXXX:param];

恭喜你,这种情况不管是不是navigationController为空,你程序极容易挂掉,原因就是因为网络请求我们都会用异步方式来拉取数据,当数据回来之后,会回调到本类的XXXReceive:obj方法,

但是如果界面退出了,数据才收到将如何?那就是不是空指针调用了,TwitterClient里纪录的需要回调的内存地址上神马情况都有可能是,回调。。杯具了

解决办法:twitterClient做成成员,在析构的时候该咋收拾twitterClient的就咋收拾一下吧

3、self.navigationController为nil,界面挂了

和上文一样twitterClient成员了,dealloc也清理了现场,还是会挂

原因分析:异步的问题,twitterClient已经取到数据,但是sampleViewController已经被释放了,but
dealloc根本没来得及进来。。。

解决办法,1:确保nav正确,2:尽量在界面viewDidLoad的时候网络请求数据,在dispear的时候清理网络。

情况二:

reason: ‘Pushing a navigation controller is not supported‘

报上面的错误,原因是:

大家知道,可以将ViewController push到一个 NavigationController中。就像是入栈操作!

将一个NavigationController再次push到NavigationController中时,报错,出現了

reason: ‘Pushing a navigation controller is not supported‘的错误。

应该是,NavigationController不支持push进來的对象是NavigationController吧。

修改方法是:将要进入的页面不去继承UINavigationController

情况三:

有时候项目里会有一种消息推送, 就是弹出提示用户消息, 而消息中带有链接, 当你点击连接时不能跳转,

这种情况是因为你的self.navigationController = nil 造成的,

因为你弹窗的那个控制器没有用UINavigationController包装

时间: 2024-10-13 16:02:13

iOS使用NavigationController经常出现的问题的相关文章

ios去掉navigationController和tabBarController里的边框黑线

ios去掉navigationController和tabBarController里的边框黑线 by 伍雪颖 - (void)viewWillAppear:(BOOL)animated { [self.navigationController.navigationBar setBackgroundImage:[TDUtils createImageWithColor:[UIColor clearColor]] forBarMetrics:UIBarMetricsDefault]; [self.

ios修改NavigationController的背景颜色

在ios开发的过程中,我们经常需要修改NavigationController的背景颜色,当使用方法[self.navigationController.navigationBar setBackgroundColor:[UIColor redColor]]时,运行的结果并不能修改北京颜色: 现在提供一种新方法来解决这个问题: 写一个NavigationBar写一个类别: @interface UINavigationBar (BackgroundColor) //设置navigationBar

ios 把navigationController.navigationBar 下面的黑线去掉

- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"head_bar_pink_.png"] forBarMetrics:UIBarMetricsDefault]; [self.navigationController.navigationBa

ios present NavigationController

ViewController *testViewController = [[DashboardTableViewController alloc]initWithNibName:@"testViewController" bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:testViewControl

iOS 更改navigationcontroller pop出来的视图返回按钮

在navigation controller的情况下,pop一个视图出来之后,返回键默认是一个返回箭头和源视图的题目.如果没有题目,就是一个英文的back.那如果要修改这个返回按钮的话应该怎么做呢? 首先拖一个bar button item到左上方.这样子就替代了默认的按钮了.此时还不会有响应.此时需要添加响应代码. [[self navigationController] popViewControllerAnimated:YES]; 这样子就搞定了.这样子的话可以实现自定义的返回按钮. 另附

IOS之NavigationController跳转到指点的界面

在之前用的presentViewcontroller用的比较多,但是解除了NavigationController之后看了下里面的方法,也有过看过里面的方法呀, 比如返回上一级的界面:[self.navigationController popViewControllerAnimated:YES]; 返回的主界面的:[self.navigationController popToRootViewControllerAnimated:YES]; 跳转到指定的界面: NewConfigViewCon

ios 避免navigationcontroller出现时scrollview内容被resize

viewDidLoad中设置以下属性 self.automaticallyAdjustsScrollViewInsets = NO;

[iOS]在NavigationController中的ScrollView中的子视图都会下移64个像素

情况是这样的: 我有一个UINavigationController,设置为self.window的root视图, 然后有一个UIVIewController是UINavigtionController的根视图. 然后在UIViewController中加入一个ScrollView 在ScrollView中加入一个view. 此时发现. scrollView并没有自动下移64像素,而 ScrollView中的子视图VIew自动下移了64个像素. 上图: // 解决方法 self.automati

iOS 类似美团外卖 app 两个 tableView 联动效果实现

写在前面 首先声明哈,不是广告,我就是用的时候觉得这个功能比较好玩,就想着实现了一下.效果如图: 接下来简单的说一下思路吧~ 大体思路 可能我们看到这种功能的实现的时候,首先想着的是我在这个控制器中左右各放一个tableView,然后进行关联.我是用了另一个思路,具体如下: 我建了两个类LGJCategoryVC用来盛放左边写着第几类的tableView和LGJProductsVC用来盛放右边写在各种产品的tableView.然后将LGJProductsVC作为LGJCategoryVC的chi