Инкапсуляция и управление состоянием очень полезны для подобных ситуаций.В зависимости от того, сколько вы хотите инкапсулировать, вы можете рассмотреть возможность изменения 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";
}
}
Таким образом, вам не нужновключайте обработку состояния каждый раз, когда вы хотите использовать эту функцию, и кнопка всегда отражает истинное состояние объекта, с которым она работает.
Вы можете пойти еще дальше и инкапсулировать строки состояния в объекте также, который можно запросить аналогичным образом.
(Извините за плохо написанный код, я еще не пил кофе)