Кнопки панели навигации MFMailComposeViewController отключены - PullRequest
2 голосов
/ 14 января 2012

Я использую MFMailComposeViewController для отправки почты в моем приложении. Но когда присутствует контроллер представления составленной почты, все навигационные кнопки отключены (кроме кнопки «Назад» на экране выбора почтового адреса), я должен использовать кнопку «Домой» для выхода из приложения. У кого-нибудь есть идеи? Вот снимок экрана: Screen shot 2


Код:

- (void)shareVieEmail
{
    if ([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
        mailViewController.mailComposeDelegate = self;
        [mailViewController setSubject:@"Test subject"];
        [mailViewController setMessageBody:@"Mail message body" isHTML:NO];

        NSData *imageData = [NSData dataWithContentsOfFile:photourl];
        [mailViewController addAttachmentData:imageData mimeType:@"image/jpg" fileName:@"example_photo"];
        [self presentModalViewController:mailViewController animated:YES];
    } else {
        [[[UIAlertView alloc] initWithTitle:@"Cannot send mail" message:@"Device is unable to send email in its current state" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
    }
}

Метод делегата:

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    switch (result)
    {
        case MFMailComposeResultCancelled:
            //NSLog(@"Result: canceled");
            break;
        case MFMailComposeResultSaved:
            //NSLog(@"Result: saved");
            break;
        case MFMailComposeResultSent:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Result" message:@"Mail Sent Successfully" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
        }
            break;
        case MFMailComposeResultFailed:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Result" message:@"Mail Sent Failed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
        }
            break;
        default:
            //NSLog(@"Result: not sent");
            break;
    }
    if (error) {
        [[[UIAlertView alloc] initWithTitle:@"Cannot send mail" message:[NSString stringWithFormat:@"ERROR:%@", [error userInfo]] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
    }
    [self dismissModalViewControllerAnimated:YES];
}

И в заголовочном файле я объявил реализацию MFMailComposeViewControllerDelegate.

Ответы [ 3 ]

2 голосов
/ 31 января 2012

У меня была точно такая же проблема.и мне потребовалось некоторое время, чтобы понять это, но неудивительно, что все сводилось к настраиваемому UIBarButtonItem

. Держу пари, в вашем UIBarButtonItem.h есть метод

-(void)setEnabled:(BOOL)enabled ;

, и реализация выглядит такэто:

-(void)setEnabled:(BOOL)enabled {
    if (self.customView) {
        if ([[self.customView.subviews objectAtIndex:0] isKindOfClass:[UIButton class]])         {
            ((UIButton*)[self.customView.subviews objectAtIndex:0]).enabled = enabled;
        }
    }
}

, и это вызывает проблему, поэтому, как только вы закомментируете этот метод, ваша проблема должна исчезнуть.

0 голосов
/ 14 июня 2016

У меня также была эта проблема, но в моем случае это произошло потому, что я переопределил setNavigationBarHidden:animated: из UINavigationController, как предложено в этом обходном пути для ошибки в CNContactViewController. Одним из решений, которое все еще будет включать обходной путь и решение проблемы в MFMailComposeViewController, будет использование метода swizzling, чтобы иметь возможность вызывать либо оригинальный метод, либо переопределенный, в зависимости от класса текущего topViewController.

0 голосов
/ 14 января 2012

В вашем делегате MFMailComposeViewController вам нужно реализовать didFinishWithResult: и оттуда отменить модальный контроллер вида.

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{ 
    // you can test the result of the mail sending here if you want

    [self dismissModalViewControllerAnimated:YES];
}

Для Swift 4.0 +

func mailComposeController(controller: MFMailComposeViewController,
                           didFinishWithResult result: MFMailComposeResult, error: NSError?) {
    // Check the result or perform other tasks.

    // Dismiss the mail compose view controller.
    controller.dismissViewControllerAnimated(true, completion: nil)
}
...