0

我想用开关(来自菜单类)启动/停止定时器(在主类中),基于我的代码,定时器在开关打开时启动,当我关闭开关时不会停止。这是我的代码:

菜单.h

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

菜单.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];
}

主文件

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

主程序

#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 {
.....
}
4

1 回答 1

1

如果你不介意在两个类之间引入耦合,你总是可以给 FlipsideViewController 一个对 mainViewController 的引用,并让它直接戳一个方法。或者,您可以让 FlipsideViewController 在值更改时向其委托发送适当的消息,然后可以戳 mainViewController。

但是从避免不必要耦合的角度来看,最好的方法是让 mainViewController 监听,它会在被调用NSUserDefaultsDidChangeNotification时自动发送。setBool:forKey:


要求的编辑:

In Main.m, add a method like this:

- (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;
    }
}

Then change your awakeFromNib to something like this:

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

And be sure to add this to dealloc:

    [[NSNotificationCenter defaultCenter] removeObserver:self];

No changes are necessary to FlipsideViewController, and no settings bundle is needed.

于 2011-04-19T14:45:35.423 回答