Ios - 如何在不同的视图控制器中启动计时器

时间:2017-01-12 12:55:47

标签: ios objective-c xcode

我有一个视图控制器A,其中包含一个开始按钮,单击该按钮时使用“show”segue显示下一个视图。在另一个视图控制器B中,我有一个计时器。在视图控制器A中单击开始按钮后,如何让视图控制器B中的计时器启动。到目前为止,我在相同的视图控制器中有启动按钮和计时器,但是,我想将计时器移动到查看控制器B有关如何做到这一点的任何帮助吗?

4 个答案:

答案 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或通知来监视定时器触发时触发的模型的更改。两个控制器都不需要知道定时器本身甚至存在 - 它只是成为模型的实现细节。