Я создал класс для запуска MailComposer, чтобы у моего приложения на iPhone было только одно место при создании различных видов электронной почты: некоторые с вложениями, некоторые нет. Некоторые с предварительно заполненными адресами, некоторые нет.
Я не хотел, чтобы мой класс реализовывал UIViewController, но это необходимо, чтобы он мог быть делегатом для MailComposer. В противном случае контроллеры представлений, которые вызывают мой класс, сами должны быть делегатами для MailComposer, что противоречит цели.
Недостатком моего класса в качестве контроллера представления является то, что он должен загружаться на экран, прежде чем он сможет модально вызвать MailComposer. К сожалению, контроллеры представления не могут быть прозрачными. Эффект заключается в том, что все, что находится на экране, на мгновение скрывается полностью белым контроллером представления, прежде чем появится MailComposer.
Возможно, я мог бы жить с этим, но не с этим: после того, как MailComposer ушел, я остался с моим пустым контроллером представления, занимающим экран. Я должен быть в состоянии избавиться от него изнутри, вызвав это:
[self.parentViewController dismissModalViewControllerAnimated:NO];
Но это умирает ужасной смертью: «Загрузка стека 43365 кадров ...»
Имеет ли мой класс - UIViewController, который предварительно заполняет, а затем запускает MailComposer - потерянный трек своего parentViewController? Это не ноль, потому что я проверял это.
Как запущено из текущего контроллера вида ...
// My class is called Email.
Email *oEmail = [[[Email alloc] init] retain];
// Red, to remind myself that I'd like to someday learn to make it transparent.
oEmail.view.backgroundColor = [UIColor redColor];
// Pre-fill whatever fields you want, and specify attachments.
oEmail.EmailSubject = @"I am truly stumped";
// This has to go on screen first.
[self presentModalViewController:oEmail animated:NO];
// Then this can happen, which brings up the MailComposer.
[oEmail f_SendEmail];
// Commenting out the next line didn't help, so I turned it back on.
[oEmail release];
Внутри класса вам нужен mailComposeController: didFinishWithResult: error: метод, чтобы убрать MailComposer, и для этого класс должен быть MFMailComposeViewControllerDelegate. Вот что там происходит:
// This gets rid of the mail composer.
[self dismissModalViewControllerAnimated:YES];
// This never fails to get rid of other modal view controllers when called
// from within those controllers, but boy does it not work here.
[self.parentViewController dismissModalViewControllerAnimated:NO];
Если вы можете мне помочь, я буду искренне благодарен!