2013-11-05 1 views
2

버튼을 사용하여 일부 콘텐츠를 공유하는 UIActivityViewController를 보여주는 매우 간단한 경우가 있습니다. 문제는 사용자가 이메일을 취소하거나 보낼 때 메일 작성자가 삭제되지 않는다는 것입니다. 발표자가 UITabbarController 하위 일 때 UIActivityViewController가 MFMailComposeViewController를 닫지 않는 이유는 무엇입니까?

NSArray *items = [NSArray arrayWithObjects:@"share",nil]; 
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; 
[self presentViewController:activityViewController animated:YES completion:nil]; 

은 내가 activityViewController.completionHandler에서 모달 뷰를 해제하려고하지만 콘솔은 다른 애니메이션이 과정에 때로는 응용 프로그램을 충돌, 그래서 이것은 해결책이 아니라고 말한다. 게다가 다른 소셜 네트워크 (페이스 북, 트위터)는 아무 것도하지 않고 잘 작동합니다.

일부 테스트 후 UIActivityViewController를 표시하는 UIViewController가 UITabBarController의 자식 인 경우에만 발생하는 것으로 나타났습니다.

UIViewController > UINavigationController > UITabbarController > Window 

을하지만 난 TabBar의를 제거하면 모든 문제가 제시 해결 미세! :

UIViewController > UINavigationController > Window 

해결 방법을 작동합니다 내 AppDelegate에 내가이 같은 응용 프로그램을 작성하는 경우 작동하지 않습니다 rootviewcontroller에서.

[self.view.window.rootViewController presentViewController:activityViewController animated:YES completion:NULL]; 

하지만 여기서 무슨 일이 일어나고 있는지 알고 싶습니다.

감사합니다. ;)

답변

0

나는 똑같은 문제가있어서 알아 낸 후에 현재 창에서 활성화되어있는 클래스의 메일 작곡가를 발표하지 않을 때 응답하지 않을 것입니다. 매 통화마다 나타나기도하고, 똑같은 문제는 해를 끼친다. UITabbarController의 경우에만 해당되는 것은 아닙니다. 현재 윈도우에없는 다른 컨트롤러에서 프리젠 테이션을 할 때 모든 아키텍처에서 발생할 수 있습니다. 그게 당신의 해결 방법이 작동하고 그 잘못은 아니지만 때문입니다.

나는 uipopover 내부에서 탭핑 된 메일 작곡가를 발표하고있었습니다. Mail Composer는 Popover 컨트롤러 클래스로 제공되고있었습니다. 그리고 나는 당신이 직면 한 동일한 문제에 직면하고있었습니다.

MFMailComposeViewController *mailComposer = [MFMailComposeViewController new]; 

    [mailComposer addAttachmentData:data mimeType:@"application/pdf" fileName:model.documentTitle]; 

    [mailComposer setSubject:model.documentTitle]; // Use the document file name for the subject 

    if(kBccEmailID) 
     [mailComposer setBccRecipients:[[NSArray alloc]initWithObjects:kBccEmailID, nil ]]; 

    mailComposer.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 

    mailComposer.modalPresentationStyle = UIModalPresentationFormSheet; 

    AppDelegate *delagate =(AppDelegate *) [[UIApplication sharedApplication]delegate]; 

    mailComposer.mailComposeDelegate = [[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject]; // Set the delegate 


    [(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject] presentViewController:mailComposer animated:YES completion:nil]; 

은 [(의 UIViewController *)는 [[(은 UINavigationController *)는 delagate.window.rootViewController는 viewControllers] lastObject] 당신의 'self.view.window.rootViewController'에 대한 대안 : 그럼 난 내 코드를 변경했습니다.

+0

도움이된다면 '수락'을 보내 주시면 감사하겠습니다. –

+0

흥미 롭습니다! 그러나 어떤 시스템이 현재 윈도우 *에서 활성화되어 있는지 시스템이 판단하는 방법을 이해하지 못합니다. 왜 VC가 활성 컨트롤러가 아닌 것으로 간주하는 tabbar 컨트롤러에있는 경우? – alejandromp

+0

당신은 그것에 대해 신경 쓸 필요가 없습니다. 그것을 처리하는 시스템입니다. 그것은 그를 통해 컨트롤러를 얻는 것을 스택을 통해 뷰 컨트롤러의 트랙을 유지합니다. –