首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在5秒后从一个视图控制器自动分离到另一个视图控制器

如何在5秒后从一个视图控制器自动分离到另一个视图控制器
EN

Stack Overflow用户
提问于 2015-02-24 11:03:57
回答 4查看 287关注 0票数 0

我有一个视图控制器,我把它命名为家庭场景。我有另一个名为登录场景的视图控制器。现在想要推送从我的家庭现场到登录场景后,5秒后运行我的项目。我已经创建了一个从Home场景到login场景的手动索引,并将标识符名称作为登录名。现在,当我运行我的项目时,就在运行之后,它正在从家庭场景推送到登录场景,在5秒后,我的项目崩溃了,错误出现了,"'Receiver ()没有带标识符的segue‘’“。请帮助我解决这个问题。谢谢。

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

代码语言:javascript
运行
复制
-(void)viewDidAppear:(BOOL)animated {

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


}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-24 11:10:56

使用dispatch_after()而不是-performSelector:withObject:afterDelay:

代码语言:javascript
运行
复制
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [self performSegueWithIdentifier:@"login" sender:self];
});

当你调用表演选择器时,他们就像你那样做了

代码语言:javascript
运行
复制
[self performSelector:@selector(performSegueWithIdentifier:sender:)
           withObject:self afterDelay:5];

消息中只传递一个参数。

代码语言:javascript
运行
复制
[self performSegueWithIdentifier:self sender:nil];

显然不是你想要的。

更新

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-02-24 11:13:14

另一种选择:

代码语言:javascript
运行
复制
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];

});
票数 0
EN

Stack Overflow用户

发布于 2015-02-24 11:14:06

试试这个:

代码语言:javascript
运行
复制
-(void)viewDidAppear:(BOOL)animated {
   [self performSelector:@selector(pushNewVC)
       withObject:nil afterDelay:5.0];
}



-(void)pushNewVC {
   [self performSegueWithIdentifier:@"login" sender:self];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28694099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档