Я пытаюсь запрограммировать приложение для Iphone с помощью Xcode 4.3.1, и то, что я хотел бы сделать, это нажать кнопку и прикоснуться где-нибудь на сенсорном экране и иметь ярлык (с прикрепленным таймером) отображаются и отсчитываются от некоторого числа. Когда таймер достигнет 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;
}
}
Любая помощь на всех была бы оценена. В основном я хотел бы помочь с возможностью одновременного использования нескольких таймеров с использованием массива или чего-то еще. Жесткое кодирование большого количества таймеров было бы глупым делом.
Cheers.
EDIT 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, чтобы это сделать. Или, может быть, вы могли бы связать меня с примером, который мог бы мне помочь.
Cheers.
Ничего себе, много полезной информации здесь. То, что я пытался сделать, это создать одну кнопку, которая управляет созданием нового индивидуального таймера, который имеет визуальный вывод на экране (я думал об использовании UILabel), показывая его оставшееся время. Я хочу иметь возможность сделать это несколько раз, и таймеры аннулируют себя в конце их собственной индивидуальной временной последовательности. Я могу понять многое из того, что вы сказали, поскольку я изучил другие языки, хотя, как я сказал, мои навыки с Objective-C очень ограничены. Не могли бы вы объяснить чуть подробнее? Благодарю. – Zocozoro
Кажется, что метод действия '-start:' запускает и останавливает таймер. Это говорит о том, что на таймер будет отдельная кнопка. –
Да, он действует как двойная функция (начало и остановка), хотя я не планирую иметь это в своем приложении. Код выше был тем, что делает мой полный класс таймера (я написал это, когда я узнал о таймерах), я не забыл удалить его, прежде чем опубликовать его. Прошу прощения за путаницу. – Zocozoro