UINavigationController在viewWillAppear函数中pushViewController时的问题和解决

原来代码是在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, 也是可行的, 非常奇怪,原因还不清楚.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值