你好我对xcode和编程一般都是新手。我正在尝试创建一个具有两个视图控制器的简单应用程序。故事板中的第一个ViewController没有代码只有一个导航栏和一个下一个按钮,它有一个连接到VideoController的模态。我已将此代码添加到VideoController.m文件
- (void)viewDidLoad
{
[super viewDidLoad];
//code added
[NSTimer scheduledTimerWithTimeInterval:3.0
target:self
selector:@selector(goBack)
userInfo:nil repeats:NO];
}
//code added
-(void)goBack{
[self.navigationController popViewControllerAnimated:YES];
}
然而,正如我所希望的那样,在3秒延迟之后,这并没有让我回到上一页。有什么建议?我不知道我错过了什么
答案 0 :(得分:0)
编辑 - 您实际上不必保留计时器,但保留计时器将允许您稍后通过使计时器无效来取消计时器。
首先,你必须保留你的计时器。将其作为属性添加到您的班级
in .h
@property (strong, nonatomic) NSTimer *timer;
in .m
self.timer = [NSTimer scheduledTimerWithTimeInterval:3.0
target:self
selector:@selector(goBack)
userInfo:nil repeats:NO];
其次,您可以使用dispatch_after
代替
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self.navigationController popViewControllerAnimated:YES];
});
最后,不要这样做。无论您使用视频控制器做什么,您都不希望人们无缘无故地抛出控制器。您可能应该等到视频播放完毕并在播放结束通知中关闭控制器。
答案 1 :(得分:0)
您不需要使用计时器来触发一次动作,GCD和dispatch_after()
也可以正常工作,而无需使用局部变量来存储计时器或使其无效。
例如
如果使用segue将第二个视图控制器推入堆栈,则可以从prepareForSegueMethod中删除它。
我已经这样做了:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqual:@"FirstToSecond"]) {
// Use GCD to dispatch a call to pop the view controller
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.navigationController popToRootViewControllerAnimated:YES];
});
}
}
您可以下载此working example。