计时器返回到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中的上一个视图[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Swift:在 nstimer 倒计时结束时转换到新的视图控制器 [重复]