UIButton, как предотвратить двойные действия - PullRequest
0 голосов
/ 12 июля 2010

Я не совсем уверен, как работает UIButton. Например, если у меня есть таймер, который срабатывает при нажатии кнопки запуска, как мне сделать так, чтобы при повторном нажатии кнопки не запускался другой таймер. Потому что тогда мой таймер работает вдвое быстрее. Кажется, что я хотел бы сделать недействительным свой оригинальный таймер, если дважды нажать кнопку, и запустить новый таймер, но я не знаю, как определить, что кнопка была нажата дважды.

Кроме того, есть ли способ изменить метку на кнопке UIB после ее однократного нажатия, а затем вернуть ее обратно при повторном нажатии? Нравится, Play / Pause? Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июля 2010

Инкапсуляция и управление состоянием очень полезны для подобных ситуаций.В зависимости от того, сколько вы хотите инкапсулировать, вы можете рассмотреть возможность изменения UIButton нового объекта (вы упомянули «Воспроизведение / Пауза», поэтому я представляю какой-нибудь медиаплеер?)enumeration состояний в этом примере, чтобы сделать его более расширяемым, но для простоты я буду использовать BOOL)

@interface MediaManager : NSObject
{

    BOOL isPlaying;  // whether
    NSTimer *playTimer; // timer used exclusively by the media manager
    //... other vars relating to type of media/selected track etc   anything related
}

-(void) togglePlay;


@property (nonatomic, synthesize) NSTimer *playTimer;
@propety (nonatomic, assign) BOOL isPlaying;

@end


@implementation MediaManager

@synthesize playTier, isPlaying;


- (void)togglePlay 
{
    if (!self.isPlaying)  
    {
        if (self.playTimer == nil) // if it hasn't already been assigned
        {
            self.playTimer = [NSTimer ...]; // create and schedule the timer
            self.isPlaying = YES;
        }
    }
    else 
    {
        if (self.playTimer != nil)
        {
            // get the timer and invalidate it
            self.isPlaying = NO;
        }
    }

}

@end

Это не лучший пример, но с инкапсуляцией состояниявнутри отдельного объекта ваше представление UIButton может полагаться исключительно на состояние модели для представления себя (при условии, что оно содержит ссылку на инициализированный Media Manager:

-(IBAction) buttonPressed: (id) sender
{
    [self.mediaManager togglePlay]; // play from whatever state it is in 

    // update the button text to reflect state
    if (self.mediaManager isPlaying)
    {
        self.mediaButton.textLabel.text = @"Pause";
    }
    else
    {
        self.mediaButton.textLabel.text = @"Play";
    }

}

Таким образом, вам не нужновключайте обработку состояния каждый раз, когда вы хотите использовать эту функцию, и кнопка всегда отражает истинное состояние объекта, с которым она работает.

Вы можете пойти еще дальше и инкапсулировать строки состояния в объекте также, который можно запросить аналогичным образом.

(Извините за плохо написанный код, я еще не пил кофе)

0 голосов
/ 12 июля 2010

Если ваш таймер не равен нулю, кто-то уже установил его, что означает, что кнопка уже нажата.Рассмотрим:

@interface MyController : UIViewController {
    @private NSTimer *timer;
}
- (IBAction)pressButton: (id)sender;
@end

@implementation MyController
- (IBAction)pressButton: (id)sender {
    if (!self->timer) {
        self->timer = [NSTimer scheduledTimer...];
    }
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...