iPhone MailComposer класс UIViewController dismissModalViewController Анимированные проблемы - PullRequest
0 голосов
/ 01 апреля 2010

Я создал класс для запуска 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];

Если вы можете мне помочь, я буду искренне благодарен!

Ответы [ 2 ]

1 голос
/ 01 апреля 2010

Вместо звонка

[self.parentViewController dismissModalViewControllerAnimated:NO];

Я бы назначил делегата для вашего контроллера электронной почты. Пример такого рода соединения можно увидеть в шаблоне приложения «FlipSide» при создании нового проекта.

По сути, вы бы настроили делегата для контроллера электронной почты:

Email *oEmail = [[[Email alloc] init] retain];
oEmail.view.backgroundColor = [UIColor redColor]; 
oEmail.EmailSubject = @"I am truly stumped";
[self presentModalViewController:oEmail animated:NO];
[oEmail f_SendEmail];
[oEmail setDelegate:self];
[oEmail release];

Затем в файле электронной почты .h:

@protocol EmailDelegate
-(void)emailDidFinish;
@end

@implementation Email : UIViewController {
      // Other stuff
      id <EmailDelegate> delegate;
}

@property (nonatomic, assign) id <EmailDelegate> delegate;

@end

Убедитесь, что вы @synthesize делегат, тогда, когда вы будете готовы отклонить его, позвоните:

// 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.
if (delegate && [delegate respondsToSelector:@selector(emailDidFinish)]){
   [delegate emailDidFinish];
}

И, наконец, в исходном контроллере представления убедитесь, что вы попали в файл .h, а затем:

-(void)emailDidFinish {
   [self dismissModal...];
}

Надеюсь, это поможет.

0 голосов
/ 20 апреля 2010

У меня была такая же проблема, и я решил ее по-другому.

Я создал функцию, которая выскакивает текущий ViewController. В ч:

-(void)ics;

В cpp:

-(void)ics{
  //[self.navigationController popViewControllerAnimated:NO];   
  [self.navigationController popToRootViewControllerAnimated:YES];
}

и вызвал его после закрытия MailComposer:

[self dismissModalViewControllerAnimated:YES];
[self ics];

вуаля!

...