我有一个视图控制器A,其中包含一个开始按钮,单击该按钮时使用“show”segue显示下一个视图。在另一个视图控制器B中,我有一个计时器。在视图控制器A中单击开始按钮后,如何让视图控制器B中的计时器启动。到目前为止,我在相同的视图控制器中有启动按钮和计时器,但是,我想将计时器移动到查看控制器B有关如何做到这一点的任何帮助吗?
答案 0 :(得分:1)
使用以下代码。 //FirstViewController.m
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController()
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)startButton:(id)sender {
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *controller = [storyBoard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[controller startTimer];
[self.navigationController pushViewController:controller animated:YES];
}
// SecondViewController.h
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController {
}
-(void)startTimer;
@end
// SecondViewController.m
#import "SecondViewController.h"
@interface SecondViewController ()
@property (nonatomic,retain) NSTimer *timer;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)startTimer {
if (!_timer) {
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];
}
}
-(void)stopTimer {
if ([_timer isValid]) {
[_timer invalidate];
}
_timer = nil;
}
- (void)timerFired:(NSTimer *)timer {
NSLog(@"%@",timer.fireDate);
}
-(void) viewWillDisappear:(BOOL)animated {
[self stopTimer];
}
答案 1 :(得分:0)
如果按钮显示下一个UIViewController并且还应该在那里启动一个计时器,为什么不在下一个ViewController的viewWillAppear
方法中启动计时器?
或者在第一个viewController中使用prepareForSegue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"show_segue_id_from_storyboard"]) {
ViewController2 *yourNextViewController = segue.destinationViewController;
[yourNextViewController startTimer];
}
}
当点击按钮触发segue时,将调用startTimer
函数。
答案 2 :(得分:0)
// First VC prepareForSegue
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"your segue"])
{
SecondVC *vc = (SecondVC *)segue.destinationViewController;
[vc.timer startTimer:nil];
}
}
//Add below line in second Vc 's .h file.
@property (nonatomic, strong) NSTimer *timer;
- (void)stopTimer:(id)sender;
- (void)timerFired:(NSTimer *)timer;
// Second VC's Public Methods
@interface SecondVC ()
@end
@implementation SecondVC
- (void)startTimer:(id)sender {
if (!self.timer) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];
}
}
- (IBAction)stopTimer:(id)sender {
if ([self.timer isValid]) {
[self.timer invalidate];
}
self.timer = nil;
}
- (void)timerFired:(NSTimer *)timer {
NSLog(@"Timer fired");
}
答案 3 :(得分:0)
在另一个视图控制器B中,我有一个计时器。在视图控制器A中单击开始按钮后,如何让视图控制器B中的计时器启动。
为什么定时器需要成为任何视图控制器的一部分?考虑到多个控制器需要访问它,并且它可能是应用程序逻辑的一部分而不是直接与用户界面相关,将计时器移动到应用程序模型中会更有意义。然后,视图控制器A可以告诉模型已单击开始按钮,并且视图控制器B可以使用KVO或通知来监视定时器触发时触发的模型的更改。两个控制器都不需要知道定时器本身甚至存在 - 它只是成为模型的实现细节。