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

Posted

技术标签:

【中文标题】如何从我的应用程序委托启动一个 NSTimer,它在 Viewcontroller.m 中调用我的方法【英文标题】:How do I start an NSTimer from my app delegate which calls my method in Viewcontroller.m 【发布时间】:2014-12-20 13:18:45 【问题描述】:

当我的应用关闭时,我希望它在 viewController.m 中调用 void 方法

我试过了:

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

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**

【问题讨论】:

仅供参考:一旦您的应用程序进入后台并随后被挂起,将不会触发任何计时器。 【参考方案1】:

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

尝试将NSTimer 创建中的自我交换为视图控制器引用...

【讨论】:

【参考方案2】:

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

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

在你的视图控制器中列出这个:

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

【讨论】:

以上是关于如何从我的应用程序委托启动一个 NSTimer,它在 Viewcontroller.m 中调用我的方法的主要内容,如果未能解决你的问题,请参考以下文章

NSTimer 泄漏内存(CFArray?)

NSTimer 导致崩溃

NSTimer 在后台模式下使用 locationManager 委托(“作弊方式”)SWIFT

使用 NStimer 使用默认图像设置图像动画

定时器(NSTimer scheduledTimerWithTimeInternval)和蓝牙委托:CBPeripheralDelegate 不适用于 NSTimer

如何让我的应用在后台运行 NSTimer?