从MFMailComposeViewController恢复时处理错误

时间:2018-03-28 22:21:44

标签: ios objective-c

我的应用程序是一个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通知的事件。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你是对的。该应用程序仍然在前台运行。

答案 1 :(得分:0)

因此,一个可能的解决方案是在打开Mail.app时执行相同的appDidEnterInBackground代码,并在

的主体中执行相同的appWillEnterForeground
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
    [controller dismissViewControllerAnimated:YES completion:^{

    }];
}

您怎么看?