2012-03-29 4 views
5

Я пытаюсь создать «класс отправителя электронной почты для служебных программ», который я могу использовать в нескольких проектах iPhone.MFMailComposeViewController в отдельном классе

Я создал заголовок и реализацию MailSender для этой цели.

MailSender.h:

@interface MailSender : NSObject<MFMailComposeViewControllerDelegate> 

- (id) initWithParent:(UIViewController*) mainController; 

- (void) invokeMailSender:(NSString*) to:(NSString*) subject:(NSString*) failureTitle:(NSString*) failureMessage:(NSString*) failureCancel; 

@end 

MailSender.m:

#import "MailSender.h" 

@implementation MailSender 

MFMailComposeViewController* mailer; 
UIViewController* mailParentController; 

- (id) initWithParent:(UIViewController*) mainController 
{ 
    if(self = [super init]) 
    { 
     mailParentController = mainController; 
    } 
    return self; 
} 

- (void) invokeMailSender:(NSString*) to:(NSString*) subject:(NSString*) failureTitle:(NSString*) failureMessage:(NSString*) failureCancel; 

{ 
    if([MFMailComposeViewController canSendMail]) 
    { 
     mailer = [[MFMailComposeViewController alloc] init]; 

     mailer.mailComposeDelegate = self; 

     [mailer setSubject:subject]; 

     NSArray *toRecipients = [NSArray arrayWithObjects:to, nil]; 

     [mailer setToRecipients:toRecipients]; 
     [mailParentController presentModalViewController:mailer animated:YES]; 
    } 
    else 
    { 
     UIAlertView* alert = [[UIAlertView alloc] initWithTitle:failureTitle message:failureMessage 
                 delegate:nil cancelButtonTitle:failureCancel otherButtonTitles: nil]; 

     [alert show]; 
    } 
} 

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
    // Do nothing 
    [mailParentController dismissModalViewControllerAnimated:YES]; 
    mailer = nil; 
} 



@end 

я назвал класс от View Controller (в кнопке приземлится действие), используя следующие инструкции:

@implementation InfoViewController 

MailSender *sender; 

- (IBAction)openMail:(id)sender 
{ 
    sender = [[MailSender alloc] initWithParent:self]; 
    [sender invokeMailSender:@"[email protected]" :@"123" :@"123" :@"123" :@"123"]; 
} 

.... 
@end 

Когда я запускаю код, я могу корректно показывать сообщения электронной почты. Однако после этого следует крах. Обратите внимание, что у меня нет сбой при использовании MFMailComposeViewController непосредственно из моего UIViewController (и назначение контроллера View в качестве делегата),

Любые идеи? Извините, что я все еще новичок в Objective C :)

+1

Я не вижу проблем в этом коде ... должен работать нормально !!! просто попробуйте очистить здание/перезапустить xcode. Я думаю, что он рушится откуда-то еще. –

+0

Если я удалю: mailer.mailComposeDelegate = self; он больше не падает! Что-то не так с моим делегатом? – SiN

+0

В какое время он падает? Это когда метод делегирования 'doneFinishWithResult' вызван каким-либо образом? Также вы можете опубликовать код своего контроллера просмотра, который вызывает метод initWithParent? – Mutix

ответ

7

Вам нужно сохранить экземпляр MailSender отправителя. Он выдается после вызова сообщения invoke.

Вы можете сделать это, объявив property по имени sender. Например.

@property (strong, nonatomic) MailSender *sender; 
... 
@synthesize sender = _sender; 
... 
self.sender = [[MailSender alloc] initWithParent:self]; 
[self.sender invokeMailSender:@"[email protected]" :@"123" :@"123" :@"123" :@"123"]; 

Кстати, ваше объявление метода немного смешно. Вы должны указать аргументы. Например.

- (void)invokeMailSender:(NSString *)sender 
         to:(NSString *)to 
       subject:(NSString *)subject 
      failureTitle:(NSString *)failureTitle 
      failureMessage:(NSString *)failureMessage 
failureCancelButtonTitle:(NSString *)failureCancelButtonTitle 
+0

Большое спасибо, что работают. Благодарим также за ваши подсказки для объявления метода. У меня есть два вопроса, которые я не знаю, если вы можете мне ответить: 1. Почему ARC выпускала экземпляр отправителя, зная, что я не сбил его? 2- С предоставленным вами решением отправитель свойства * теперь доступен всем классам (поскольку он находится в заголовке), любым способом сделать его приватным (конкретный вариант реализации, а не в заголовке)? Извините за любое заблуждение с моей стороны. – SiN

+1

Это было выпущено, потому что вы больше не использовали его после того, как вызвали сообщение invoke. Вы можете сделать свойство частным, используя категорию. См. Эту ссылку http://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-c –

+0

Большое спасибо – SiN