2013-07-11 40 views
0

我想從NSObject子類展示MFMailComposeViewController。情景是:從NSObject呈現MFMailComposeViewController

  • 我UIViewController子類在什麼用戶輕按一鍵啓動某些程序
  • 這一進程的所有邏輯取出這個視圖控制器來NSObject的子類
  • 如果有什麼不對的過程我正在顯示UIAlertView
  • 此alertView中的一個按鈕應打開mailComposer,以便用戶向我發送反饋。

如果我想從NSObject子類嘗試呈現mailComposer,我得到「試圖呈現模態視圖控制器不在類層次結構中」。所以我將我的viewController設置爲MFMailComposeViewController的委託。但通過觸摸alertView上的「發送反饋」按鈕,它消失了,我得到了「試圖呈現模態視圖控制器不在類層次結構中」的錯誤。我想記錄什麼是RootViewController的這樣:

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

但日誌顯示,我認爲RVC等於(空)。我可以直接從NSObject提供mailController,或者如何以正確的方式完成?

+0

嘗試此代碼獲取窗口參考: AppDelegate * appDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; UIViewController * rootVC = [appDelegate.window rootViewController]; – Mrunal

+1

@Mrunal執行'UIViewController * rootVC = [UIApplication sharedApplication] .keyWindow.rootViewController;''''更容易。無需獲取涉及的應用程序代理。 – rmaddy

回答

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

+0

謝謝你明確的解釋,你幫了很多! – Alex

相關問題