2015-01-22 2 views
0

Я имею ViewController с кнопкой, и действие на кнопку:почты Композитор не уволит IOS

 - (IBAction)clickMe:(id)sender { 
      MailHelper *helper = [[MailHelper alloc] init]; 
      [helper setAllData:self]; 
     } 

Кроме того, есть вспомогательный класс для почты слагающих (MailHelper.h):

#import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
    #import <MessageUI/MessageUI.h> 

    @interface MailHelper : UIViewController<MFMailComposeViewControllerDelegate> 

    @property MFMailComposeViewController* mailView; 
    - (void)setAllData:(UIViewController *)ctrl; 

    @end 

и реализация (MailHelper.m):

- (void)setAllData:(UIViewController *)ctrl { 

    mailView = [[MFMailComposeViewController alloc] init]; 
    mailView.mailComposeDelegate = self; 

    mailView.toRecipients = @[@"[email protected]"]; 
    [mailView setSubject:@"Subject"]; 

    [ctrl presentViewController:mailView animated:YES completion:nil]; 
} 

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

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Я могу открыть почту композитор, но при отправке почты, сохранения проекта или удаления Draf t сбой приложений. Есть идеи?

ответ

1

Хорошо, ребята. Решение, чтобы сделать экземпляр помощника где-то еще, скажем:

@implementation ViewController 
MailHelper *helper; 

и:

- (IBAction)clickMe:(id)sender { 
    helper = [[MailHelper alloc] init]; 
    [helper setAllData:self]; 
} 
3

Когда MFMailComposeViewController является просьбой об увольнении, вы вызываете метод увольнения по телефону self, но self представляет te MFMailComposeViewController. Изменение:

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

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

в

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

    [controller dismissViewControllerAnimated:YES completion:nil]; 
} 

Чтобы исправить вопрос открепление добавить следующее:

импортировать <objc/runtime.h> в вас .m файл и self быть связан с контроллером прошло:

static void * MailHelperKey = &MailHelperKey; 

- (void)setAllData:(UIViewController *)ctrl { 
mailView = [[MFMailComposeViewController alloc] init]; 
mailView.mailComposeDelegate = self; 

objc_setAssociatedObject(mailView, MailHelperKey, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
.... 
} 


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

    [controller dismissViewControllerAnimated:YES completion:nil]; 
    objc_removeAssociatedObjects(controller); 
} 

Это будет m ake уверен, что до тех пор, пока действующий элемент управления не освободит ваш почтовый помощник. Не стоит ценить цену за красоту, но она должна работать.

+0

Я попробовал это. Это не решение. – Faruk

+1

Это решение для опубликованной проблемы. у вас должна быть другая проблема. – vikingosegundo

+0

Правда. Спасибо, @rckoenes. Проверьте метод clickMe: (id) отправителя. Этот метод делает экземпляр MailHelper, но он не должен, потому что, когда метод закончен, память стирается, поэтому помощник не существует. Вот почему вы не можете вернуться, когда проект сохранен, или отправлена ​​почта ... Надеюсь, вы понимаете, о чем я говорю ... – Faruk