弹出到view2时如何恢复计时器

时间:2012-07-07 17:23:24

标签: ios xcode nstimer

我的申请有3个观点

在view1中只有一个按钮(播放级别1)推送到veiw2并在view2中更新titlelabel

当view2加载并出现一个计时器开始倒计时并更新view2本身的另一个标签时,view2也有一个按钮,暂停计时器并推送到view3

在view3中只有一个按钮弹出回到view2并恢复计时器

我的问题是,当我从view3弹出到view2时,计时器仍然暂停

有什么帮助吗?

谢谢&亲切的问候。

view1.h

#import <UIKit/UIKit.h>

@interface view1 : UIViewController





-(IBAction)nextpage;

@end

view1.m

#import "view1.h"
#import "view2.h"
@interface view1 ()

@end

@implementation view1




-(IBAction)nextpage{

    view2 *obj = [[view2 alloc] init];
    [self.navigationController pushViewController:obj animated:YES];
    [obj.leveltitle setText:@"Level"];
    obj.time=10;  

}




- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [self.navigationController setNavigationBarHidden:YES];
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
     return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

view2.h

#import <UIKit/UIKit.h>

@interface view2 : UIViewController



{
    int time;
    NSTimer *timer;
    BOOL paused;
}

@property (nonatomic, retain) NSTimer *timer;
@property (readwrite, nonatomic) int time;
@property (nonatomic) BOOL paused;


@property (readwrite, retain) IBOutlet UILabel *leveltitle;
@property (nonatomic, readwrite) IBOutlet UILabel *label;



-(IBAction)back;
-(IBAction)pause;


@end

view2.m

#import "view2.h"
#import "view3.h"
@interface view2 ()

@end

@implementation view2

@synthesize leveltitle, label;
@synthesize time, timer;
@synthesize paused;

-(void)countDown2
{
    if (paused == NO && time>0) 
 {
        time = time -1 ;
     view3 *obj = [[view3 alloc] init];
     obj.sss = time;
    if (time == 0)
 {
            [timer invalidate];    

 }

        [label setText:[NSString stringWithFormat:@"%i",time]];
 }


}


-(IBAction)back{

    [self.navigationController popViewControllerAnimated:YES];

}


-(IBAction)pause{

     view3 *obj = [[view3 alloc] init];
    [self.navigationController pushViewController:obj animated:YES];
     paused = YES;   
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}



- (void)viewDidLoad
{
    paused = NO;
    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self     selector:@selector(countDown2) userInfo:nil repeats:YES];



    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:    (UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

view3.h

#import <UIKit/UIKit.h>

@interface view3 : UIViewController

{

    int sss;
}

@property (nonatomic) int sss;
-(IBAction)back;


@end

view3.m

#import "view3.h"
#import "view2.h"
@interface view3 ()

@end

@implementation view3
@synthesize sss;

-(IBAction)back{

    view2 *obj = [[view2 alloc] init];
    obj.paused=NO;
    obj.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self     selector:@selector(cont) userInfo:nil repeats:YES];
     //[obj.timer fire];
    [self.navigationController popViewControllerAnimated:YES];

}



 -(void)cont{
     view2 *obj = [[view2 alloc] init];
     obj.time = sss;
     if (obj.paused == NO && time>0) 
     {
         obj.time = obj.time -1 ;

         if (obj.time == 0)
         {
             [obj.timer invalidate];    

         }

         [obj.label setText:[NSString stringWithFormat:@"%i",obj.time]];
     }



 }


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

1 个答案:

答案 0 :(得分:1)

这是因为在view3的{​​{1}}方法中,您创建了back名称view2的新时刻并设置了obj。但是paused=NO当你回弹时obj不是view2的同一时刻。您需要做的是使用委托方法模式,以便view3view2中使用回调方法将paused设置为NO

有关委托方法模式的示例,请查看此SO中的示例。

编辑:示例回调代码:

对您的代码进行以下添加/更改:

在view2.h中:

#import "view3.h"

@interface view2 : UIViewController <view3Delegate>

在view2.m中:

-(IBAction)pause{

    view3 *obj = [[view3 alloc] init];
    obj.delegate = self;  //adding this line
    [self.navigationController pushViewController:obj animated:YES];
    paused = YES;   
}

-(void)setPausedValue:(BOOL)value   //this is the new method callback from view3 to set paused value
{
    paused = value;
}

在view3.h中:

#import <UIKit/UIKit.h>
@protocol view3Delegate <NSObject>
-(void) setPausedValue:(BOOL)value;
@end
@interface view3 : UIViewController
{
    int sss;
}
@property (assign) id <view3Delegate> delegate;
@property (nonatomic) int sss;
-(IBAction)back;
@end

在view3.m中:

@implementation view3
@synthesize delegate;

-(IBAction)back{

//    view2 *obj = [[view2 alloc] init];  
//    obj.paused=NO;
    [self.delegate setPausedValue:NO];  //make callback and set value
    obj.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self     selector:@selector(cont) userInfo:nil repeats:YES];
    //[obj.timer fire];
    [self.navigationController popViewControllerAnimated:YES];

}