presentViewController显示白屏10-15秒

时间:2014-12-27 14:23:48

标签: ios objective-c xcode

ChangePasswordPage *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"changedPass5"];
[self presentViewController:vc animated:YES completion:nil];

如果我将此代码放在viewDidLoad中它会起作用,但是当我在一个函数中运行它时,它仍然可以工作,但是在10-15秒后使用白色屏幕,然后屏幕正确加载。

为什么?

以下是一些相关代码:

dispatch_queue_t queue = dispatch_queue_create("x.x", NULL);
dispatch_async(queue, ^{

    while(true)
    {
        sleep(1);
        checkCacheForRefreshDone = [[NSUserDefaults standardUserDefaults] stringForKey:@"homeScreenRefreshDone"];
        userChangedPassword = [[NSUserDefaults standardUserDefaults] stringForKey:@"userChangedPassword"];


       if ([checkCacheForRefreshDone isEqualToString:@"1"])
        {
            [self installAfterRefresh];    
            [feedHomeTable reloadData];
            [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"homeScreenRefreshDone"];
            [[NSUserDefaults standardUserDefaults] synchronize];
            checkCacheForRefreshDone = @"0";
            [refresh endRefreshing];
            break;
        }

    }

});


-(void)installAfterRefresh
{

    userChangedPassword = [[NSUserDefaults standardUserDefaults] stringForKey:@"userChangedPassword"];

    if ([userChangedPassword isEqualToString:@"1"])
    {
        [self detectPhone];
    }
}

detectPhone使用presentViewController的功能

FIX: 添加此方法:

[self performSelectorOnMainThread:@selector(detectPhone) withObject:nil waitUntilDone:YES];

2 个答案:

答案 0 :(得分:2)

尝试在没有self.storyboard的情况下编写代码。

变化:

ChangePasswordPage *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"changedPass5"];
[self presentViewController:vc animated:YES completion:nil];

成为:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ChangePasswordPage *vc = [storyboard instantiateViewControllerWithIdentifier:@"changedPass5"];
[self presentViewController:vc animated:YES completion:nil];

答案 1 :(得分:0)

您正在从后台线程调用该方法。影响UI的所有调用必须在主线程上完成 - 在动画或表示之前的长时间延迟是方法在错误的线程上的迹象。

使用dispatch_async将代码调回主线程。