如何在5秒后自动从一个视图控制器切换到另一个视图控制器

时间:2015-02-24 11:03:57

标签: ios objective-c

我有一个视图控制器,我把它命名为Home Scene。我有另一个名为Login Scene的视图控制器。现在想要在运行我的项目5秒后从我的家庭场景推送到登录场景。我已经创建了一个从Home Scene到Login Scene的手动segue,并将标识符名称作为登录名。现在,当我运行我的项目时,刚刚运行它就是从Home Scene推送到Login场景,5秒后我的项目崩溃,错误即将来临,"'' Receiver()没有segue与标识符'''。请帮我解决这个问题。提前谢谢。

我在.m文件中完成了这段代码

-(void)viewDidAppear:(BOOL)animated {

[self performSegueWithIdentifier:@"login" sender:self];
[self performSelector:@selector(performSegueWithIdentifier:sender:)
           withObject:self afterDelay:5];


}

4 个答案:

答案 0 :(得分:1)

使用dispatch_after()代替-performSelector:withObject:afterDelay:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [self performSegueWithIdentifier:@"login" sender:self];
});

当您按照自己的方式调用执行选择器时

[self performSelector:@selector(performSegueWithIdentifier:sender:)
           withObject:self afterDelay:5];

邮件中只传递一个参数。

[self performSegueWithIdentifier:self sender:nil];

显然不是你想要的。


<强>更新

dispatch_after()是许多Grand Central Dispatch (GCD)函数之一。 GCD使用blocksqueues在不同的线程上和/或在不同的时间运行代码(调度)。块是一个匿名函数,可以存储在变量中并作为参数传递。队列是托管的线程池。在运行时,将在队列上调度代码块。在这种情况下,执行segue在5秒延迟后在主线程上调度。

int64_t fiveSeconds = 5.0 * NSEC_PER_SEC;

dispatch_time_t fiveSecondsFromNow = dispatch_time(DISPATCH_TIME_NOW, fiveSeconds); 
dispatch_queue_t onMainThread = dispatch_get_main_queue();
dispatch_block_t performSegue = ^{
    [self performSegueWithIdentifier:@"login" sender:self];
};

dispatch_after(fiveSecondsFromNow, onMainThread, performSegue);

答案 1 :(得分:0)

另一种选择:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
   UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"yourLoginController"];
   //use your rootViewControll here to load your view
   [self.navigationController pushViewController: myController animated:YES];

});

答案 2 :(得分:0)

试试这个:

-(void)viewDidAppear:(BOOL)animated {
   [self performSelector:@selector(pushNewVC)
       withObject:nil afterDelay:5.0];
}



-(void)pushNewVC {
   [self performSegueWithIdentifier:@"login" sender:self];
}

答案 3 :(得分:0)

-(void)viewDidAppear:(BOOL)animated 
{    
     [NSThread sleepForTimeInterval:5.0];
     [self performSegueWithIdentifier:@"login" sender:self];
}

试试此代码