如何从我的应用程序委托中启动NSTimer,该委托在Viewcontroller.m中调用我的方法

时间:2014-12-20 13:18:46

标签: ios objective-c uiviewcontroller nstimer appdelegate

当我的应用关闭时,我希望它在viewController.m

中调用void方法

我试过了:

我已在NSTimer中声明了void(alarm:)(alarmm)和viewController.h,并且viewController.h已导入Appdelegate.m

AppDelegate.m:

- (void)applicationDidEnterBackground:(UIApplication *)application{

    alarmm = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(alarm:) userInfo:nil repeats:YES];

}

但是当它运行时会出现

**2014-12-20 13:53:19.881 protect my phone[3292:959295] -[AppDelegate alarm:]: unrecognized selector sent to instance 0x170043810
2014-12-20 13:53:19.884 protect my phone[3292:959295] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate alarm:]: unrecognized selector sent to instance 0x170043810'
*** First throw call stack:
(0x182e5659c 0x1935600e4 0x182e5d664 0x182e5a418 0x182d5eb6c 0x183d2ae18 0x182e0e8d8 0x182e0e588 0x182e0bfd4 0x182d390a4 0x18bee35a4 0x18766e3c0 0x10000a320 0x193bcea08)
libc++abi.dylib: terminating with uncaught exception of type NSException**

2 个答案:

答案 0 :(得分:3)

正如您所说,您在某个视图控制器中声明了alarm,但您尝试在AppDelegate上调用它,但未定义它。 因此,你会在自我身上遇到无法识别的选择器崩溃。

尝试将NSTimer创建中的self交换到视图控制器引用...

答案 1 :(得分:2)

正如 dogsgod 已经说过,您将目标设置为self,即AppDelegate。因此,您的计划计时器将在AppDelegate中查找此方法,但您在视图控制器中实现了警报方法。您必须获得对视图控制器的引用,并将此引用设置为计时器的目标。

如果您不需要UIApplicationDidEnterBackgroundNotification中的任何重要内容,也可以在视图控制器中注册通知AppDelegate并在通知回调中创建计时器。

在视图控制器中列出的内容:

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
}

- (void)onAppDidEnterBackground:(NSNotification *)notification {
    NSTimer *alarmm = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(alarm:) userInfo:nil repeats:YES];
}