2012-05-12 3 views
1

Я пытаюсь запрограммировать приложение для 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.

ответ

1

Ваш код выглядит хорошо для меня. Я бы сказал, что у вас избыточные переменные экземпляра.timerActive является избыточным, потому что вы можете просто проверить, self->timer не является nil. seconds и minutes могут быть локальными только для -timeFormat, они не обязательно должны быть переменными экземпляра.

Проблема в том, что вы не знаете, как обобщить это на несколько пар кнопок-ярлыков с несколькими таймерами? Я бы предположил, что вы создаете новый класс, чтобы действовать как контроллер для каждой пары кнопок. Класс будет получен от NSObject. В настоящее время переменные экземпляра вашего класса контроллера вида вместо этого будут переменными экземпляра этого нового класса, хотя для метки не обязательно использовать IBOutlet. (Разъем подключен в NIB, но они предположительно будут созданы динамически и будут подключены в коде.)

Вы должны выделить и инициализировать экземпляр этого нового класса для каждой пары кнопок. Вы должны передать указатель на метку и начальное значение времени. Вы также можете передать указатель на объект ViewController, которому он принадлежит, чтобы он мог сообщить об этом, когда он остановился или что-то в этом роде. Соответствующая кнопка будет настроена так, чтобы таргетировать этот новый контроллер. ViewController будет отслеживать каждый из этих контроллеров в изменяемом массиве. Когда это будет сделано с одним, он удалит свою метку, ее кнопку и контроллер.

Помогло ли это?

+0

Ничего себе, много полезной информации здесь. То, что я пытался сделать, это создать одну кнопку, которая управляет созданием нового индивидуального таймера, который имеет визуальный вывод на экране (я думал об использовании UILabel), показывая его оставшееся время. Я хочу иметь возможность сделать это несколько раз, и таймеры аннулируют себя в конце их собственной индивидуальной временной последовательности. Я могу понять многое из того, что вы сказали, поскольку я изучил другие языки, хотя, как я сказал, мои навыки с Objective-C очень ограничены. Не могли бы вы объяснить чуть подробнее? Благодарю. – Zocozoro

+0

Кажется, что метод действия '-start:' запускает и останавливает таймер. Это говорит о том, что на таймер будет отдельная кнопка. –

+0

Да, он действует как двойная функция (начало и остановка), хотя я не планирую иметь это в своем приложении. Код выше был тем, что делает мой полный класс таймера (я написал это, когда я узнал о таймерах), я не забыл удалить его, прежде чем опубликовать его. Прошу прощения за путаницу. – Zocozoro

Смежные вопросы