Защо UIActivityViewController не отхвърля MFMailComposeViewController, когато презентаторът е дете на UITabbarController?

Имам много прост случай, при който бутон показва UIActivityViewController за споделяне на съдържание. Проблемът е, че съставителят на поща не се отхвърля, когато потребителят отмени или изпрати имейл.

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

Опитах се да отхвърля модалния изглед в activityViewController.completionHandler, но след това конзолата казва, че е в процес на друга анимация и понякога срива приложението, така че това не е решението. Освен това други социални мрежи работят добре (facebook, twitter), без да правят нищо.

След някои тестове открих, че това се случва само ако UIViewController, който представя UIActivityViewController, е дете на UITabBarController. Ако в моя AppDelegate създам приложението по този начин, то не работи:

UIViewController > UINavigationController > UITabbarController > Window

но ако премахна лентата с раздели, всичко работи добре!:

UIViewController > UINavigationController > Window 

Заобиколно решение, което решава проблема, се представя от rootviewcontroller.

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

но искам да знам какво се случва тук.

Благодаря! ;)


person alejandromp    schedule 05.11.2013    source източник


Отговори (1)


Имах същия проблем и след като разбрах, разбирам, че когато не представяме композитор на поща от класа, който в момента е активен в прозореца, той няма да успее да вземе отговори известно време, сякаш няма да присъства дори при всяко повикване , същият е проблемът с уволнението. Не е така само при UITabbarController. Това може да се случи на всяка архитектура, когато я представяте от различен контролер, който в момента не е в прозореца. Ето защо вашето решение работи и все пак не е грешно.

Представях mail composer от бутон, докоснат в uipopover. Композиторът на поща беше представен в този изскачащ контролен клас. И аз бях изправен пред същия проблем, пред който сте изправени и вие. След това промених кода си на:

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“.

person Kumar Aditya    schedule 05.11.2013
comment
Интересно! Но не разбирам как системата определя кой клас е активен в момента в прозорец. Защо, когато VC е в tabbarcontroller, той счита, че не е активният контролер? - person alejandromp; 05.11.2013
comment
Не е нужно да се притеснявате за това. Системата е тази, която се грижи за това. Той поддържа следите на контролерите за изглед чрез стека, което му поставя контролера на върха. - person Kumar Aditya; 05.11.2013