版权声明:本文为博主原创文章,未经博主允许不得转载。
最近,业务提出了一个需求,在从主界面跳转到2级界面的时候,如果解析文件有错误,则直接跳转回主界面。
这是一个连ios开发菜鸟一看都可以很快得出答案的问题,很简单啊,用navigation controller 的 popViewControllerAnimated 的方式,直接就可以跳转到之前界面了。
可是,看似简单的需求,却让我这个有几年工作经验的人郁闷了好久。
在进入2级页面的时候,起线程,然后线程返回错误,这个时候需要跳转,调用回到主线程跳转的方法
[selfperformSelectorOnMainThread:@selector(back)withObject:nil
waitUntilDone:YES];
-(void)back{
[self.navigationControllerpopViewControllerAnimated:YES];
}
界面直接跳转出去了。而且二级页面的析构函数也被调用,没有内存问题,故事到这里貌似很完美。等等。
当第二次再打开界面的时候,同样的步骤,却出现了不同的结局。界面代码执行了,界面没有跳转,反而顺利的调用了了析构函数,把界面释放掉了。结果就是显示了一个被释放掉的2级界面。 o m g , 刚开始我一直以为是线程调度的问题,可是研究了好久,发现代码没啥问题哦,于是各种找,把大几千行的俩界面看了个遍,仿佛都没啥问题。这是怎么回事呢?为什么第一次跳转正常,第二次就失败而且导致崩溃呢??
也许很多大神现在该喷我了。呵呵,确实,我忽略了一个关键的问题。
就是下面这个每天都伴随我们的,可是我们却经常视而不见的奇葩函数,-(void) viewDidAppear:(BOOL)animated;
这个函数不用多介绍了,每次进入界面,都会调这个方法。第一次我进入了2级界面之后,在我解析完成之前系统就调用了这个方法,于是我解析错误就直接正常退出了。但是天杀的系统,我再次进入2级界面之后,解析完成的时候,竟然还没有调用-(void) viewDidAppear.导致我直接跳转界面会失败。这个小问题,花费了我个把小时,所以不吐不快。于是,加上了判断,界面随便进入一点问题都没有。
-(void) viewDidAppear:(BOOL)animated{
_viewDidAppear =YES;
if(_parseBookError){
[selfperformSelectorOnMainThread:@selector(back)withObject:nil
waitUntilDone:YES];
}
}
- (void)parseError:(NSString*)msg{
_parseBookError = YES;
if(_viewDidAppear)
[self performSelectorOnMainThread:@selector(back) withObject:nil
waitUntilDone:YES];
}
看来经验主义会害死人啊,我没有想到界面都显示了,-(void) viewDidAppear 还没有正常被调用。以后要注意了。如果能帮到各位,希望各位给我留个好啊。