Ответ 1
Убедитесь, что вы используете
controller.mailComposeDelegate = self;
а не
controller.delegate = self;
Я вызываю MFMailComposeViewController
из UITableViewController
.
Проблема заключается в том, что метод делегата никогда не вызывается, когда я выбираю кнопку "Отмена" или "Отправить" в окне "Написать письмо":
mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult
Вот класс представления таблицы:
@implementation DetailsTableViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section==0 && indexPath.row==4) {
//SEND MAIL
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
if ([MFMailComposeViewController canSendMail]) {
[controller setSubject:[NSString stringWithFormat:@"Ref %@",[item objectForKey:@"reference"]]];
[controller setMessageBody:@" " isHTML:NO];
[controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]];
[self presentModalViewController:controller animated:YES];
}
[controller release];
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
// NEVER REACHES THIS PLACE
[self dismissModalViewControllerAnimated:YES];
NSLog (@"mail finished");
}
Приложение не сбой. После нажатия кнопки "Отмена" или "Отправить" окно "Компонента" остается на экране с отключенными кнопками. Я могу выйти из приложения, нажав клавишу "Домой".
Я могу открыть другую форму Modal Views TableView, но не MailCompose.
Убедитесь, что вы используете
controller.mailComposeDelegate = self;
а не
controller.delegate = self;
Ваша сигнатура метода неверна:
- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
Должно быть:
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
Обратитесь к этой статье для полной реализации: http://www.ioscreator.com/tutorials/send-email-from-an-app
рабочий код после удаления устаревшего:
#import <MessageUI/MFMailComposeViewController.h>
@interface SettingsTableViewController () <MFMailComposeViewControllerDelegate, UITextFieldDelegate, UITextViewDelegate>
@end
@implementation SettingsTableViewController
// add default methods
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger sectionNum = indexPath.section;
NSInteger rowNum = indexPath.row;
if (sectionNum == 2 && rowNum == 1) {
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
if ([MFMailComposeViewController canSendMail]) {
[controller setSubject:[NSString stringWithFormat:@"Invitation to Northstar app"]];
[controller setMessageBody:@" " isHTML:NO];
// [controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]];
//presentViewController:animated:completion:
[self presentViewController:controller animated:YES completion:NULL];
}
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
NSLog (@"mail finished");
[self dismissViewControllerAnimated:YES completion:NULL];
}
@end
Я столкнулся с той же проблемой и искал исправление за последние 2 дня, после чего сам нашел исправление, и вы не поверите, насколько это было незначительно.
В моем случае контроллер представления (скажем, "DetailsTableViewController" в соответствии с этим вопросом), откуда я представлял MFMailComposeViewController
, уже представлен из какого-либо другого контроллера представлений (например, "BaseViewController" ).
Проблема лежала в 'modalPresentationStyle
' элемента DetailsTableViewController, представляя ее из BaseViewController.
В тот момент, когда я изменил его с "UIModalPresentationFormSheet
" на "UIModalPresentationPageSheet
" (если на то пошло что-то, кроме "UIModalPresentationFormSheet
" ), проблема была решена, и методы делегирования почтового контроллера начали стрелять, как обычно.
Примечание. Я уже вызывал метод ниже в "DetailsTableViewController" (для этого примера), поэтому для меня не имело значения, что "modalPresentationStyle
" я использовал.
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
self.view.superview.bounds = CGRectMake(0, 0, 1024, 768);
self.view.superview.backgroundColor = [UIColor clearColor];
}