定时器返回xcode中的上一个视图

时间:2014-04-05 09:38:49

标签: ios objective-c uiviewcontroller

你好我对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秒延迟之后,这并没有让我回到上一页。有什么建议?我不知道我错过了什么

2 个答案:

答案 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