MFMailComposeViewController в делегате - PullRequest
       15

MFMailComposeViewController в делегате

0 голосов
/ 29 сентября 2011

Вопрос касается приложения, которое использует много представлений в стиле контроллера UINavigation.

В моем делегате есть простая функция, которая может использоваться всеми представлениями для вывода сообщения об ошибке

// В Appdelegate.m

-(void)popErrorWindow:(NSString *)theError
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:theError
                                                   delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Report",nil];
    [alert show];
    [alert release];
}


- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
        if (buttonIndex == 1)
        {
            NSLog(@"report");
            [self mailIt:@"error name"];
        }
    }

Теперь, желая иметь механизм, который будет отправлять сообщение об ошибке вместе с некоторыми другими данными, которые я создал, это:

-(void)mailIt:(NSString *)theError {
    NSLog(@"Mail it");
    pickerMail = [[MFMailComposeViewController alloc] init];
    pickerMail.mailComposeDelegate = self;

    [pickerMail setSubject:@"error via email"];

NSMutableString *body = [NSMutableString string];

    [body appendString:@"Error XXX "];

    [pickerMail setMessageBody:body isHTML:YES];


    // Problem here:
    [self.window presentModalViewController:pickerMail animated:YES];   
}

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error

{
    // Problem here:
    [self.window  dismissModalViewControllerAnimated:YES];
    //NSLog(@"mail was sent");
}

Проблема в self.window, который не является правильным способом доступа к нему от делегата, Я все еще хочу, чтобы почтовый элемент был в делегате, так как все представления могут вызывать предупреждение об ошибке, и я хотел бы иметь только одно место для этого механизма.

Как мне сделать это изнутри делегата, что должно заменить self.window?

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Возможно переопределение popErrorWindow: и mailIt: в категории на UIViewController. Таким образом, у вас есть доступ к контроллеру представления верхнего уровня для вызова presentModalViewController и dismissModalViewControllerAnimated on.

В качестве альтернативы вы можете сделать это в подклассе UIViewController и затем сделать его подклассом своего другого пользовательского контроллера представления. Недостатком этого метода является наличие подклассов классов, отличных от UIViewController

1 голос
/ 29 сентября 2011
- (void)mailComposeController:(MFMailComposeViewController *)controller 
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError *)error
{
    [controller dismissModalViewControllerAnimated:YES];
}

РЕДАКТИРОВАТЬ:

Методы - (void)presentModalViewController:(UIViewController *)vc и - (void)dismissModalViewControllerAnimated:(BOOL)animated являются экземпляром UIViewController, поэтому его нельзя использовать с UIWindow.

Чтобы подарить вашему почтовому контроллеру приятную анимацию, вы можете сделать это:

UIViewController *aController = self.navigationController.presentedViewController;
[aController presentModalViewController:pickerMail animated:YES];
...