Кнопка отмены MFMailComposeViewController (возможно, файл действия) замерзает вид
Я видел несколько вопросов до таких, как , но из-за отсутствия принятого ответа, а также для того, чтобы реализовать все по мере необходимости, я по-прежнему продолжаю сталкиваться с проблемой следующим образом:
Я показываю почтовый композитор, но при нажатии "Отмена", просмотр композитора замерзает. Я думаю, что это связано с тем, что лист действий "Сохранить/удалить" появится из видимого кадра. Да, я установил mailComposeDelegate в предстающий контроллер представления и прочитал несколько аналогичных вопросов, когда пользователь не обработал делегата (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
, чтобы отклонить композитор при отмене. Я тоже это обработал, но, по-видимому, мне кажется, что я не понял, почему лист действий не отображается в видимой области экрана в версии iPhone моего универсального приложения. Рамка просмотра диспетчера представления, представляющая почтовый композитор в виде NSLogged, представляет собой (0,0,320,480). Мое приложение универсально, а композитор почты отлично работает на iPad. Ниже приведен снимок экрана о том, как выглядит композитор, работающий на iPhone Simulator 5.1: -
![enter image description here]()
Здесь приведен код для отображения композитора:
-(IBAction)mailButtonPressed:(id)sender {
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"Subject"];
[controller setMessageBody:@"Test" isHTML:YES];
[controller setToRecipients:nil];
if(controller) {
[self presentModalViewController:controller animated:YES];
[controller release];
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error
{
[self dismissModalViewControllerAnimated:YES];
}
Ответы
Ответ 1
Почему бы не попробовать удалить код и повторить попытку, следуя онлайн-учебнику, например:
http://iphonedevsdk.com/forum/tutorial-discussion/43633-quick-tutorial-on-how-to-add-mfmailcomposeviewcontroller.html
В таких случаях вы всегда забываете одну простую строку кода, необходимую для работы, поэтому, следуя учебному пособию, я могу убедиться, что весь необходимый код существует.
Попробуйте использовать этот код:
- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
switch (result)
{
case MFMailComposeResultCancelled:
NSLog(@"Mail cancelled");
break;
case MFMailComposeResultSaved:
NSLog(@"Mail saved");
break;
case MFMailComposeResultSent:
NSLog(@"Mail sent");
break;
case MFMailComposeResultFailed:
NSLog(@"Mail sent failure: %@", [error localizedDescription]);
break;
default:
break;
}
// Close the Mail Interface
[self dismissViewControllerAnimated:YES completion:NULL];
}
Ответ 2
Используйте весь этот код для сообщения:
.h
#import <MessageUI/MFMailComposeViewController.h>
@interface EmailViewController : UIViewController<MFMailComposeViewControllerDelegate>
.m
-(IBAction)Email {
MFMailComposeViewController *composer = [[MFMailComposeViewController alloc] init];
[composer setMailComposeDelegate:self];
if ([MFMailComposeViewController canSendMail]) {
[composer setToRecipients:[NSArray arrayWithObjects:@"[email protected]", nil]];
[composer setSubject:@"Idea for Basic Calculator"];
[composer setMessageBody:@"My idea is:" isHTML:NO];
[composer setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[self presentModalViewController:composer animated:YES];
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
if (error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error with message" message:[NSString stringWithFormat:@"Error %@", [error description]] delegate:nil cancelButtonTitle:@"Try Again Later!" otherButtonTitles:nil, nil];
[alert show];
[self dismissModalViewControllerAnimated:YES];
}
else {
[self dismissModalViewControllerAnimated:YES];
}
}
Ответ 3
Возможно, устройство, которое вы пытаетесь, не может отправить почту по какой-либо причине
Вы можете проверить это с помощью [MFMailComposeViewController canSendMail]
Ответ 4
Примените это в
-(void)displayComposerSheet
if(composer != nil) {
[composer release];
composer = nil;
}
После предоставления значения этому объекту
[picker composer];
Ответ 5
Похоже, вы не используете автоматический подсчет ссылок (ARC). Вы слишком рано освобождаете контроллер почты. Отпустите его после его отклонения.
Удалить эту строку: [release контроллера]
if(controller) {
[self presentModalViewController:controller animated:YES];
/// remove this: ----> [controller release];
}
и отпустите этот контроллер здесь
- (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error
{
[self dismissModalViewControllerAnimated:YES];
[controller release]; // <---- add this
}
Ответ 6
Добавьте это к своим (всем) UIViewControllers, чтобы проверить, закончился ли ваш iPhone или память. Это может объяснить странное поведение, т.е. MailComposerSheet выпустил ваш базовый viewController, поэтому mailComposerDelegate равен нулю.
- (void)didReceiveMemoryWarning
{
NSLog(@"didReceiveMemoryWarning");
[super didReceiveMemoryWarning];
}