0

我正在尝试从 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]);

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

4

1 回答 1

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.

于 2013-07-11T14:33:25.153 回答