我的应用程序是一个quizz游戏。用户回答问题的时间有限。
使用计时器。当时间用完时,会触发一个简单的声音。
NSTimer *m_timer;
在函数viewDidAppear中:
m_timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(decrementSpin) userInfo:nil repeats:YES];
在我的fisrt版本中,我遇到了以下情况:
如果在一个问题中,来电中断了游戏,那么计时器在通话过程中仍然在计算。
我通过添加函数viewDidLoad修复了这个问题:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterInBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
- (void)appDidEnterInBackground:(NSNotification *)notification {
[[SoundManager sharedManager]stopMusic:NO];
[m_timer invalidate];
m_timer = nil;
}
- (void)appWillEnterForeground:(NSNotification *)notification {
if(m_timer) {
[m_timer invalidate];
m_timer = nil;
}
//NSLog(@"%d", self.TimerbackgroundView.percent);
m_timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(decrementSpin) userInfo:nil repeats:YES];
}
函数decrementSpin更新时钟图像并在播放器时间用完时播放声音。
一切都运作良好。
自我上一版以来,我添加了一项功能。用户可以通过按下按钮来报告问题(对于不正确的内容)。
按下按钮时,它会打开包含预先填充内容的邮件应用程序。
MFMailComposeViewController*mailComposerVC = [[MFMailComposeViewController alloc] init];
if ([MFMailComposeViewController canSendMail]) {
mailComposerVC.mailComposeDelegate = self;
[mailComposerVC setToRecipients:@emailAddress];
[mailComposerVC setSubject:emailSubject];
[mailComposerVC setMessageBody:emailBody isHTML:NO];
[self presentViewController:mailComposerVC animated:YES completion:^{
}];
}
else{
NSLog(@"Unable to send message");
}
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
[controller dismissViewControllerAnimated:YES completion:^{
}];
}
当用户发送邮件并返回问题页面时,我的应用程序似乎无法正确处理。
计时器不会暂停(如来电情况),此外,当问题页面重新出现时,时钟图像显示初始图像(与第一次出现的页面完全一样)
此错误会导致在下一页播放期间播放声音(用户用完时触发的声音)。
我唯一想到的是,在MFMailComposeViewController的情况下,未涵盖UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification通知的事件。
有什么想法吗?
答案 0 :(得分:0)
你是对的。该应用程序仍然在前台运行。
答案 1 :(得分:0)
因此,一个可能的解决方案是在打开Mail.app时执行相同的appDidEnterInBackground代码,并在
的主体中执行相同的appWillEnterForeground- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
[controller dismissViewControllerAnimated:YES completion:^{
}];
}
您怎么看?