从NSObject呈现MFMailComposeViewController

时间:2013-07-11 14:08:47

标签: ios objective-c delegates mfmailcomposeviewcontroller

我正在尝试从NSObject子类提供MFMailComposeViewController。场景是:

  • 我有UIViewController子类,用户点击按钮开始某个过程
  • 此过程的所有逻辑都从此ViewController中取出到NSObject子类
  • 如果我正在显示UIAlertView
  • 的过程有问题
  • 此alertView中的一个按钮应该打开mailComposer,以便用户向我发送反馈。

如果我正在尝试来自NSObject子类的现在mailComposer,我正在“试图呈现模态视图控制器什么不在类层次结构中”。所以我将viewController设置为MFMailComposeViewController的委托。但是通过触摸alertView上的“发送反馈”按钮它就会消失,而我正在尝试“尝试提供模态视图控制器不在类层次结构中”的错误。我试图以这种方式记录rootViewController:

    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    UIViewController *rootViewController = window.rootViewController;
    NSLog(@"rvc - %@", [rootViewController description]);

但log向我显示rvc等于(null)。我可以直接从NSObject呈现mailController,或者如何以正确的方式完成它?

1 个答案:

答案 0 :(得分:4)

如错误消息所示,呈现MFMailComposeViewController的对象必须是视图层次结构的一部分。换句话说,它必须是具有当前可见视图的视图控制器。您拥有所有逻辑的NSObject派生类应该有一个代理回到它管理的UIViewController,它可以调用它来告诉它显示MFMailComposeViewController。此模式是iOS开发不可或缺的一部分,并在View Controller Programming guide中介绍。这是一个例子:

@protocol ACFeedback <NSObject>
- (void)showFeedbackMailMessage;
@end

@interface ACDataThing : NSObject
@property (nonatomic, weak) id<ACFeedback> feedbacker;
@end

@interface ACEmptyViewController : UIViewController<ACFeedback>
...

当您实例化ACDataThing时,将feedbacker属性设置为ACEmptyViewController引用,然后在ACEmptyViewController中实现方法showFeedbackMailMessage以创建并显示MFMailComposeViewController