0

NSObject サブクラスから MFMailComposeViewController を提示しようとしています。シナリオは次のとおりです。

  • ユーザーがボタンをタップしてプロセスを開始するUIViewControllerサブクラスがあります
  • このプロセスのすべてのロジックは、この ViewController から NSObject サブクラスに取り出されます
  • プロセスに何か問題がある場合は、UIAlertView を表示しています
  • この alertView のボタンの 1 つは、ユーザーが私にフィードバックを送信できるように 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 開発に不可欠であり、ビュー コントローラー プログラミング ガイドで説明されています。次に例を示します。

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

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

@interface ACEmptyViewController : UIViewController<ACFeedback>
...

をインスタンス化するときは、プロパティを参照ACDataThingに設定し、ACEmptyViewController でを作成して表示するメソッドを実装します。feedbackerACEmptyViewControllershowFeedbackMailMessageMFMailComposeViewController

于 2013-07-11T14:33:25.153 に答える