我正在尝试从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还是以正确的方式完成它?

最佳答案

如错误消息所示,显示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

关于ios - 从NSObject呈现MFMailComposeViewController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17595630/

10-13 06:34