iPhone UISwitch запускает / останавливает помощь NSTimer! - PullRequest
0 голосов
/ 19 апреля 2011

Я хочу запустить / остановить таймер (в основном классе) с переключателем (из класса меню), основываясь на моем коде, таймер запускается, когда переключатель включен, и не останавливается, когда я выключаю переключатель. Вот мой код:

menu.h

@protocol FlipsideViewControllerDelegate;
@interface FlipsideViewController : UIViewController  {
id <FlipsideViewControllerDelegate> delegate;
IBOutlet UISwitch *fireSwitch;
}
@property (assign)UISwitch* fireSwitch;
-(IBAction)autoFire;

menu.m

#import "FlipsideViewController.h"
#import "mainViewController.h"
@synthesize fireSwitch;

- (void)viewDidLoad
{
   NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
//[super viewDidLoad];
fireSwitch.on = [defs boolForKey:activateautoplay];

}

-(IBAction)autoFire {
          NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
[defs setBool:fireSwitch.on forKey:activateautoplay];
[[NSUserDefaults standardUserDefaults] synchronize];
}

main.h

#import "FlipsideViewController.h"
#define activateautoplay @"isactivateautoplay"
@interface mainViewController : UIViewController <FlipsideViewControllerDelegate> {
NSTimer *Autotimer;
}
-(void)updateImagePosition:(NSTimer*)mytimer;

main.m

#import "mainViewController.h"
@sunthesize Autotimer;

- (void)awakeFromNib {
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
if ([defs boolForKey:activateautoplay]) {
    self.Autotimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateImagePosition:) userInfo:nil repeats:YES];
} else {
    [self.Autotimer invalidate];
}
}


-(void)updateImagePosition:(NSTimer*)mytimer {
.....
}

1 Ответ

1 голос
/ 19 апреля 2011

Если вы не возражаете против введения связи между двумя классами, вы всегда можете просто дать FlipsideViewController ссылку на mainViewController и заставить его напрямую указывать метод. Или вы можете сделать так, чтобы FlipsideViewController отправлял соответствующее сообщение своему делегату при изменении значения, которое затем могло бы ткнуть в mainViewController.

Но с точки зрения избежания ненужной связи лучший способ состоит в том, чтобы mainViewController прослушивал NSUserDefaultsDidChangeNotification, который будет автоматически отправляться при вызове setBool:forKey:.


Запрошенное редактирование:

В Main.m добавьте метод, подобный этому:

- (void)startOrStopTimer {
    NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
    if ([defs boolForKey:activateautoplay]) {
        if (!self.Autotimer) self.Autotimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateImagePosition:) userInfo:nil repeats:YES];
    } else {
        [self.Autotimer invalidate];
        self.Autotimer = nil;
    }
}

Затем измените awakeFromNib на что-то вроде этого:

- (void)awakeFromNib {
    [self startOrStopTimer];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startOrStopTimer) name:NSUserDefaultsDidChangeNotification object:nil];
}

И обязательно добавьте это к dealloc:

    [[NSNotificationCenter defaultCenter] removeObserver:self];

Нет необходимости вносить изменения в FlipsideViewController, и комплект настроек не требуется.

...