Кнопка отмены MFMailComposeViewController (возможно, файл действия) замерзает вид - программирование
Подтвердить что ты не робот

Кнопка отмены 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];
}
4b9b3361

Ответ 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];
}