来自 NSObject 类的 MFMailComposeViewController 显示问题 - iOS

Posted

技术标签:

【中文标题】来自 NSObject 类的 MFMailComposeViewController 显示问题 - iOS【英文标题】:MFMailComposeViewController Display Issue from NSObject Class - iOS 【发布时间】:2014-08-27 16:57:25 【问题描述】:

我在尝试从 NSObject 类实现时遇到 MFMailComposeViewController 的问题。

我已经多次使用 MFMailComposeViewController 没有问题,但总是在视图控制器中。

但是,在这种情况下,我调用了一个将运行的 NSObject 类,而用户通常在一个 ViewController 上。但是,这段代码是从多个视图控制器运行的,因此使用了 NSObject,并且我需要允许作曲家在任何视图控制器上呈现。

问题是完成后,它需要抛出一个电子邮件编辑器,而我无法让它工作。相反,它从不启动 Mail Composer 视图。

我有委托,代码如下,委托在 .h 中设置。

MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];

    if([MFMailComposeViewController canSendMail])
        mc.mailComposeDelegate = self;
        [mc setSubject:emailTitle];
        [mc setMessageBody:messageBody ishtml:NO];
        [mc setToRecipients:toRecipents];

        [[mc navigationBar] setTintColor: [UIColor whiteColor]]; // Text color
        // Present mail view controller on screen
        [self presentViewController:mc animated:YES completion:^
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
        ];

    


- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error

    switch (result)
    
        case MFMailComposeResultCancelled:
            // NSLog(@"Mail cancelled");
            break;
        case MFMailComposeResultSaved:
            // NSLog(@"Mail saved");
            break;
        case MFMailComposeResultSent:
            // NSLog(@"Mail sent");
            break;
        case MFMailComposeResultFailed:
            // NSLog(@"Mail sent failure: %@", [error localizedDescription]);
            break;
        default:
            break;
    

    // Close the Mail Interface

    [self dismissViewControllerAnimated:YES completion:NULL];


我还尝试将代码转移到 AppDelegate,并使用来自 NSObject 类的通知来触发作曲家,但是,使用此方法我发现作曲家将显示在推送的 VC 上,但如果是模态视图当前显示,它不显示作曲家。

最后,我尝试添加一个完全独立的视图控制器,向其中添加邮件编写器,然后通过 AppDelegate 添加它,但这也只会显示在推送的 VC 上,而不是模态 VC。

我的想法是我需要找到导航堆栈的“顶部”,以便在其上方显示作曲​​家,但我不是 100% 确定。

我会欢迎任何能够阐明我如何实现这一点的人的 cmets,因为我确信这一定是可能的,因为如果代码在View Controller 本身,但显然这意味着我需要将这样的代码添加到多个 VC 中,虽然我可以,但这似乎是一种必须继续的奇怪方式。

谢谢大家!

【问题讨论】:

【参考方案1】:

我以为我会回来回答这个问题!

MFMailComposeViewController 必须在 ViewController 中启动。这是设计使然。

【讨论】:

我刚才碰到了这个问题,预感就是问题所在。感谢您发布后续消息以确认我的怀疑。

以上是关于来自 NSObject 类的 MFMailComposeViewController 显示问题 - iOS的主要内容,如果未能解决你的问题,请参考以下文章

处理来自另一个类的 CLLocationManager 委托

NSObject

为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?

iOS Class 使用NSProxy和NSObject设计代理类的差异

iOS之深入解析少见却神奇的NSProxy类的多种使用

OC基础--OC中类的定义