创建多个自我失效的计时器

时间:2012-05-12 04:08:55

标签: objective-c xcode

我正在尝试使用Xcode 4.3.1为Iphone编写应用程序,我希望能够做的是按下按钮并触摸触摸屏上的某个位置并显示标签(附带计时器)起来并从一些数字倒计时。当计时器到达0:00时,我希望它自己失效并且这样做我需要保持它的参考。

我不知道我之前会使用多少标签/计时器,所以我想我会用一个数组来存储每一个。我对Objective-C语言知之甚少。到目前为止,我所做的一切都只是复制了我在其他stackoverflow问题中看到的例子,试图理解它们。到目前为止,我已经能够构建一个功能相对较强的计时器。

以下是我当前的计时器代码。目前它只是一个预先制作的按钮,连接到预制标签,具有我希望我的计时器具有的所有功能。它从5分钟开始,将自身格式化为分钟:秒,并在计时器到达0:00时使其无效。定时器启动后,该按钮还可用作停止/复位功能。

ViewController.h

@interface ViewController : UIViewController{

    IBOutlet UILabel *timerDisplay;
    NSTimer *timer;
    bool timerActive;
    int MainInt;
    int minutes;
    int seconds;

}

@property (nonatomic, retain) UILabel *timerDisplay;

-(IBAction)start:(id)sender;
-(void)countdown;
-(void)timerStop;
-(void)timeFormat;

@end

ViewController.m

@implementation ViewController

@synthesize timerDisplay;

-(void)timeFormat{
    seconds = MainInt % 60;
    minutes = (MainInt - seconds) / 60;
    timerDisplay.text = [NSString stringWithFormat:@"%d:%.2d", minutes, seconds];
}

-(void)countdown {
    MainInt -= 1;
    [self timeFormat];
    if (MainInt <=0){
        timerActive = NO;
        [self->timer invalidate];
        self->timer = nil;
    }
}

-(IBAction)start:(id)sender {
    MainInt = 300;
    [self timeFormat];
    if(timerActive == NO){
        timerActive = YES;
        self->timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countdown) userInfo:nil repeats:YES];
    }
    else {
        timerActive = NO;
        [self->timer invalidate];
        self->timer = nil;
    }
}

任何帮助都将不胜感激。我非常希望能够使用数组或其他东西一次拥有多个计时器。对大量计时器进行硬编码将是一件愚蠢的事情。

干杯。

编辑2:

我有以下代码作为我的应用程序,这正是我想要它做的。除了在这段代码中,我一次只能运行一个计时器,这是我的问题。

在此代码中,我将最近一次点击的值存储在触摸屏上(使用其坐标将计时器放置在屏幕上的某个位置),以及一个按钮,当我按下它时,一个正在运行的计时器(带有UILabel)将出现在先前存储的水龙头的位置。它将一直运行直到完成,然后使自身无效并从视图中移除自身。 这很好。

然而,当我在原始计时器完成之前再次按下按钮时,它将在新位置创建一个新计时器(带UILabel)。这个新的计时器工作正常,但旧的计时器已经丢失了它的计时器参考,所以无法完成,我无法将其删除。

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{

    UILabel *timerDisplay;
    NSTimer *timer;
    CGPoint startPoint;
    int MainInt;

}

@property CGPoint startPoint;

-(IBAction)startTimer:(id)sender;
-(void)countdown;
-(void)timeFormat;
-(void)start;

@end

ViewController.m:

@implementation ViewController

@synthesize startPoint;

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *theTouch = [touches anyObject];
    startPoint = [theTouch locationInView:self.view];
}

-(IBAction)startTimer:(id)sender {

    timerDisplay = [[UILabel alloc] initWithFrame:CGRectMake(startPoint.x -15, startPoint.y - 15, 50, 50)];
    timerDisplay.textAlignment = UITextAlignmentCenter;
    timerDisplay.text = [NSString stringWithFormat:@"%i", MainInt];
    timerDisplay.backgroundColor = [UIColor greenColor];
    timerDisplay.textColor = [UIColor whiteColor];
    [self.view addSubview:timerDisplay];
    [self start];

}

-(void)timeFormat{
    int seconds = MainInt % 60;
    int minutes = (MainInt - seconds) / 60;
    timerDisplay.text = [NSString stringWithFormat:@"%d:%.2d", minutes, seconds];
}

-(void)countdown {
    MainInt -= 1;
    [self timeFormat];
    if (MainInt <= 0){
        [self->timer invalidate];
        self->timer = nil;
        [timerDisplay removeFromSuperview];
    }
}

-(void)start {
    MainInt = 5;
    [self timeFormat];
    if(self->timer == nil){
        self->timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countdown) userInfo:nil repeats:YES];
    }
}

@end

我希望有人可以帮助我创建一个新类来保存每个新的计时器实例并保留对它们的引用。我缺乏Objective C的知识来完成这项工作。或许你可以把我联系到一个可以帮助我的例子。

干杯。

1 个答案:

答案 0 :(得分:1)

您的代码看起来不错。我会说你有多余的实例变量。 timerActive是多余的,因为您只需检查self->timer是否为非nilsecondsminutes可能只是-timeFormat的本地,它们不需要是实例变量。

您不知道如何将此概括为具有多个计时器的多个按钮标签对的问题?我建议您创建一个新类,作为每个按钮标签对的控制器。该课程将来自NSObject。视图控制器类的当前实例变量将是这个新类的实例变量,尽管您不一定使用IBOutlet作为标签。 (插座连接在NIB中,但这些可能是动态创建的,并且会以代码形式连接。)

您可以为所需的每个按钮标签对分配和初始化此新类的实例。您将传递指向标签和开始时间值的指针。您也可以将指针传递给拥有它的ViewController对象,以便它可以在停止时或类似的情况下通知它。相应的按钮将设置为以此新控制器为目标。 ViewController将在可变数组中跟踪每个控制器。完成后,它将删除其标签,按钮和控制器。

这有帮助吗?