1

Xcode 4.3.1を使用してIphone用のアプリをプログラムしようとしています.ボタンを押してタッチスクリーンのどこかに触れて、ラベル(タイマーが付いたもの)を表示してカウントすることができます.いくつかの数からダウン。タイマーが 0:00 に達したら、それ自体を無効にしたいので、そのためには参照を保持する必要があります。

事前に使用するラベル/タイマーの総数がわからないので、配列を使用してそれぞれを保存すると考えていました。私は、Objective-C 言語に関する知識がほとんどありません。私がこれまで行ってきたことはすべて、他のスタックオーバーフローの質問で見た例を複製して、それらを理解しようとしているだけです. これまでのところ、比較的機能的なタイマーを作成できました。

以下は、タイマーの現在のコードです。現在、タイマーに必要なすべての機能を備えた既製のラベルに接続された既製のボタンです。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:

私は自分のアプリとして機能する以下のコードを持っています。これはまさに私がやりたいことです。このコードを除いて、一度に実行できるタイマーは 1 つだけです。これが私の問題です。

このコードでは、タッチスクリーンでの最新のタップの値を保存します (その座標を使用してタイマーを画面上のどこかに配置するため)、およびそれを押すと実行中のタイマー (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 の知識が不足しています。または、私を助けることができる例に私をリンクすることができます.

乾杯。

4

1 に答える 1

1

あなたのコードは私には大丈夫に見えます。冗長なインスタンス変数があると思います。が非timerActiveであるかどうかを確認できるため、冗長です。にローカルである可能性があり、インスタンス変数である必要はありません。self->timernilsecondsminutes-timeFormat

これを複数のボタンに一般化する方法がわからないという問題はありますか?複数のタイマーを持つラベルのペアですか?ボタンとラベルのペアごとにコントローラーとして機能する新しいクラスを作成することをお勧めします。クラスはから派生しNSObjectます。ビューコントローラクラスの現在のインスタンス変数は、代わりにこの新しいクラスのインスタンス変数になりますが、必ずしもIBOutletラベルに使用する必要はありません。(コンセントはNIBに接続されていますが、これらはおそらく動的に作成され、コードで接続されます。)

必要なボタンとラベルのペアごとに、この新しいクラスのインスタンスを割り当てて初期化します。ラベルへのポインタと開始時刻の値を渡します。また、それを所有するオブジェクトへのポインタを渡して、ViewControllerオブジェクトが停止したときなどに通知できるようにすることもできます。対応するボタンは、この新しいコントローラーをターゲットにするように設定されます。ViewControllerこれらの各コントローラーを可変アレイで追跡します。1つで完了すると、ラベル、ボタン、およびコントローラーが削除されます。

それは役に立ちますか?

于 2012-05-12T04:50:18.580 に答える