2012-03-29 28 views
5

Tôi tìm cách tạo một "Lớp người gửi Email tiện ích" mà tôi có thể sử dụng trong một số dự án iPhone.MFMailComposeViewController trong một lớp riêng biệt

Tôi đã tạo tiêu đề và triển khai MailSender cho mục đích đó.

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 

tôi gọi là lớp từ một View Controller (trong một nút chạm xuống hành động) sử dụng các hướng dẫn sau đây:

@implementation InfoViewController 

MailSender *sender; 

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

.... 
@end 

Khi tôi chạy mã, tôi có thể hiển thị các chế độ xem email chính xác. Tuy nhiên, điều này sau đó được theo sau bởi một vụ tai nạn. Lưu ý rằng tôi không gặp sự cố khi sử dụng MFMailComposeViewController trực tiếp từ UIViewController của tôi (Và chỉ định Trình điều khiển Chế độ xem làm đại biểu),

Bất kỳ ý tưởng nào? Xin lỗi tôi vẫn còn mới đối với Mục tiêu C :)

+1

tôi không thấy bất kỳ sự cố nào trong mã này ... nên hoạt động tốt !!! chỉ cần thử xây dựng sạch/khởi động lại xcode. Tôi nghĩ nó đang rơi từ nơi khác. –

+0

Nếu tôi xóa: mailer.mailComposeDelegate = self; nó không sụp đổ nữa! Bất cứ điều gì sai với đại biểu của tôi? – SiN

+0

Vào thời gian nào nó gặp sự cố? Có phải khi phương thức ủy nhiệm 'didFinishWithResult' được gọi bởi bất kỳ cơ hội nào không? Ngoài ra, bạn có thể đăng mã của bộ điều khiển xem mà gọi phương thức 'initWithParent'method không? – Mutix

Trả lời

7

Bạn cần giữ lại phiên bản MailSender của người gửi. Nó đang được phát hành sau khi bạn gọi tin nhắn gọi.

Bạn có thể làm điều này bằng cách tuyên bố một property có tên sender. Ví dụ.

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

Nhân tiện, khai báo phương pháp của bạn hơi buồn cười. Bạn nên đặt tên cho các đối số. Ví dụ.

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

Cảm ơn rất nhiều, công việc đó. Cảm ơn cũng cho gợi ý của bạn cho việc khai báo phương pháp. Tôi có hai câu hỏi tôi không biết nếu bạn có thể trả lời tôi: 1- Làm thế nào đến ARC đã phát hành trường hợp người gửi biết rằng tôi đã không vô hiệu hóa nó? 2- Với giải pháp bạn cung cấp, thuộc tính * người gửi hiện có thể truy cập được bởi tất cả các lớp (vì nó nằm trong tiêu đề), bất kỳ cách nào để làm cho nó riêng tư (thực hiện cụ thể và không có trong tiêu đề)? Xin lỗi vì bất kỳ quan niệm sai lầm nào từ phía tôi. – SiN

+1

Nó đã được phát hành bởi vì bạn không sử dụng nó nữa sau khi bạn gọi là thông điệp gọi. Bạn có thể đặt thuộc tính ở chế độ riêng tư bằng cách sử dụng danh mục. Xem liên kết này http://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-c –

+0

Cảm ơn rất nhiều Paul – SiN

Các vấn đề liên quan