iOS-Warning--Attempt-to-present-----ViewController--0x------on--ViewCo

#Warning: Attempt to present <***ViewController: 0x****> on  whose view is not in the window hierarchy!
#简单来说,就是当前的ViewController还没有被加载完,就调用了另外一个ViewController,这显然是不允许的。

这种问题,我们平时很容易遇到,然后我们通过搜索得到解决办法,但是我们不知道为什么。
为什么呢?

-(void)viewDidLoad;第1个
-(void)viewWillAppear:(BOOL)animated;第2个
-(void)viewDidAppear:(BOOL)animated;第3个

这是三个地方依次实现的地方,我们可以在-(void)viewDidLoad中添加视图,调用方法什么的,但是如果在这里面直接跳转而不等待的话,就会出现问题咯。看下面:

- (void)viewDidLoad {
    [super viewDidLoad];=
    TestVC *vc = [[TestVC alloc]init];
    [self presentViewController:vc animated:NO completion:nil];
}

这里,当前的viewcontroller还没有加载完,就要跳转到另外一个viewcontroller里,这显然是不行的。

怎么解决呢?我们只说在viewcontroller里的这种错误。

第一种:在-(void)viewDidAppear:(BOOL)animated;里实现新的控制器跳转。
-(void)viewDidDisappear:(BOOL)animated{
    TestVC *vc = [[TestVC alloc]init];
    [self presentViewController:vc animated:NO completion:nil];
}
因为这个时候,当前的viewController已经加载完了。可以进行下一步跳转了。
第二种:延时跳转:
- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(jump) userInfo:nil repeats:NO];
}
-(void)jump{
    TestVC *vc = [[TestVC alloc]init];
    [self presentViewController:vc animated:NO completion:nil];
}
当然,2秒可以改成更短的时间,这个时间自己把握。
这种方法可以用,但是不推荐,因为这个延时有可能太长了。
第三种:在主线程上执行指定的方法
- (void)viewDidLoad {
    [super viewDidLoad];
    [self performSelectorOnMainThread:@selector(jump) withObject:nil waitUntilDone:NO];   
}
-(void)jump{
    TestVC *vc = [[TestVC alloc]init];
    [self presentViewController:vc animated:NO completion:nil];
}
waitUntilDone:
要执行的aSelector方法,是否马上执行。
如果设置为YES:等待当前线程执行完以后,主线程才会执行jump方法;
设置为NO:不等待当前线程执行完,就在主线程上执行jump方法。
如果,当前线程就是主线程,那么jump方法会马上执行。

看自己情况,选择使用合适的吧。

你可能感兴趣的:(iOS-Warning--Attempt-to-present-----ViewController--0x------on--ViewCo)