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 の知識が不足しています。または、私を助けることができる例に私をリンクすることができます.
乾杯。