2015-03-01 5 views
1

У меня стандартная реализация MFMailComposeViewController.MFMailComposeViewController didFinishWithResult проблема при появлении клавиатуры

Я установил правильные протоколы делегатов и проверил журнал, используя метод didFinishWithResult.

См:

mailComposer = [[MFMailComposeViewController alloc] init]; 
[mailComposer setSubject:emailTitle]; 
[mailComposer setMessageBody:messageBody isHTML:YES]; 
mailComposer.mailComposeDelegate = self; 

[[self getController] presentViewController:mailComposer animated:YES completion:NULL]; 

- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
    NSLog(@"mail dismiss"); 
    [[self getController] dismissViewControllerAnimated:YES completion:NULL]; 
} 

Это показывает почты композитор правильно, и все работает хорошо. Смысл, если я нажму кнопку «Отменить», вызывается метод didFinishWithResult и рассылка mailComposer.

Однако, если я пытаюсь ввести что-либо, например, TO: адрес электронной почты или что-то еще в самом почтовом композиторе, кажется, что клавиатура, которая появляется, удаляет действия делегата моего контроллера представления, поскольку «отменить "и" отправить "кнопки не активируют никаких действий.

Любые мысли? Это сводит меня с ума:/

Приветствия

EDIT

Вот код getController:

- (UIViewController *) getController 
{ 
    Class vcc = [UIViewController class]; 

    UIResponder *responder = self; 
    while ((responder = [responder nextResponder])) 
     if ([responder isKindOfClass: vcc]) 
      return (UIViewController *)responder; 

    return nil; 
} 
+0

Что именно является '[само getController]' делать? –

+0

@ DanielStorm - он получает текущий контроллер представления, так как я делаю это из UIView. Я обновил код выше, чтобы показать этот метод. – Andre

+0

Просто выстрел в темноте, но есть ли шанс, что ваш presentViewController вызывается из потока, отличного от основного потока? –

ответ

2

Whe n UITextField становится FirstResponder, чем ваш контроллер получил resignFirstResponder.

Почему вы используете метод getController? Создайте свойство на ViewController, который представляет MFMailComposeViewController.

+0

Несмотря на то, что это похоже на отложенный ответ, это было простое решение. Я уже подклассифицировал контроллер представления, поэтому я просто добавил к нему метод «отправить электронную почту», который обрабатывает настоящее/увольнение электронной почты. Спасибо – Andre

0

Установите переключатель, чтобы поймать результаты формирования почты композитора, как так:

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { 
    switch (result) { 
     case MFMailComposeResultCancelled: 
      // User tapped cancel button 
      break; 
     case MFMailComposeResultSaved: 
      // User saved email 
      break; 
     case MFMailComposeResultSent: 
      // User sent email 
      break; 
     case MFMailComposeResultFailed: 
      break; 
     default: 
      break; 
    } 
    [self dismissViewControllerAnimated:YES completion:NULL]; 
} 
+0

Привет, Даниэль. У меня было это раньше, и это не помогло. Я не вижу, как это может измениться, учитывая, что «увольнение» не связано с результатом. :/ – Andre

0

Я бы рекомендовал эту реализацию:

- (void) presentMailViewController 
    if([MFMailComposeViewController canSendMail]) 
    { 
     MFMailComposeViewController *mail = [MFMailComposeViewController new]; 
     mail.mailComposeDelegate = self; 
     mail.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;; 
     [self.navigationController presentViewController:mail animated:YES completion:nil]; 
    } 
} 

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
    if(error) 
    { 
     //... 
    } 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

И я рекомендую вам прочитать эту страницу: Code Naming Basics

+0

Спасибо, но это не касается моей проблемы в любом случае ... – Andre

Смежные вопросы