原来代码是在viewDidAppear函数中pushViewController,
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
CCRLoginViewController *controller=[[CCRLoginViewController alloc] initWithNibName:@"CCRLoginViewController" bundle:nil];
controller.hidesBottomBarWhenPushed = NO;
controller.showBackButton = NO;
[self.navigationController pushViewController:controller animated:NO];
[controller release];
return;
}由于viewDidAppear是在视图完成后执行的,要求改进为在viewWillAppear函数中执行,出现问题
-(void)viewWillAppear:(BOOL)animated{
[super viewDidAppear:animated];
CCRLoginViewController *controller=[[CCRLoginViewController alloc] initWithNibName:@"CCRLoginViewController" bundle:nil];
controller.hidesBottomBarWhenPushed = NO;
controller.showBackButton = NO;
[self.navigationController pushViewController:controller animated:NO];
[controller release];
return;
}
在push之后, controller的view虽然存在于navigationController的view的subviews中,但是无法显示出来, 在连续点击之后,会出现黑屏现象. 发现在viewWillAppear中pushViewControoler之后,viewDidAppear函数不会执行,也会影响到子controller的绘制. 再试过各种方法之后,发现pushViewController在viewWillAppear函数中不可行,
解决方法是不用push函数,而是直接执行navigationController的setViewControllers函数,直接设置为新的controller,原来的旧controller从堆栈中移除.
-(void)viewWillAppear:(BOOL)animated{
[super viewDidAppear:animated];
CCRLoginViewController *controller=[[CCRLoginViewController alloc] initWithNibName:@"CCRLoginViewController" bundle:nil];
controller.hidesBottomBarWhenPushed = NO;
controller.showBackButton = NO;
[self.navigationController setViewControllers:[[NSArray alloc]initWithObjects:controller, nil]];
[controller release];
return;
奇怪的是,发现如果将pushViewController的animated不设为NO而设为YES, 也是可行的, 非常奇怪,原因还不清楚.
本文探讨了在iOS开发中遇到的一个特定问题:当试图在viewWillAppear而非viewDidAppear中执行视图控制器的推送(push)操作时,新视图无法正常显示的问题。文章详细介绍了问题的现象、分析过程,并给出了两种解决方案:一是采用pushViewController方法并设置动画参数;二是使用navigationController的setViewControllers方法。
5

被折叠的 条评论
为什么被折叠?



