计时器返回到xcode中的上一个视图[重复]

Posted

技术标签:

【中文标题】计时器返回到xcode中的上一个视图[重复]【英文标题】:Timer to return to previous view in xcode [duplicate] 【发布时间】:2014-04-05 09:38:49 【问题描述】:

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

【问题讨论】:

你已经问过同样的问题三遍了。您需要了解导航控制器的工作原理。请阅读一些导航控制器教程。 【参考方案1】:

编辑 - 您实际上不必保留计时器,但保留它可以让您稍后通过使计时器无效来取消它。

首先你必须保留你的计时器。将其作为属性添加到您的类中

在.h中

@property (strong, nonatomic) NSTimer *timer;

在.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];
);

最后,不要这样做。无论您使用视频控制器做什么,您都不希望人们无缘无故地离开控制器。您可能应该等到视频播放完毕,然后在播放结束通知中关闭您的控制器。

【讨论】:

@reecon 对 -1 有什么解释吗? 对不起,就像我说的,我在这里完全是个菜鸟,我应该把 dispatch_after 代码放在哪里? in viewDidLoad 按照你的逻辑 是的,我将代码添加到 viewDidLoad,但仍然无法正常工作。 @Eugene,创建属性不会改变任何东西。没必要。定时器不会被释放。即使您不存储对计时器的引用,也会执行 fire 方法。【参考方案2】:

您不需要使用计时器来触发一次操作,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这个。

【讨论】:

以上是关于计时器返回到xcode中的上一个视图[重复]的主要内容,如果未能解决你的问题,请参考以下文章

NSTimer 中的错误(Swift:Xcode)

Swift:在 nstimer 倒计时结束时转换到新的视图控制器 [重复]

Xcode Swift 3:计时器和 Segue 视图控制器错误

如何在xcode中在后台重复触发进程

视图未在 Android 的相对布局中显示 [重复]

在返回位置之前如何等待计时器?