Что я делаю не так с моим кодом, когда пытаюсь создать письмо в iOS?(Помогите мне понять протоколы / делегаты) - PullRequest
0 голосов
/ 12 февраля 2011

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

Сложность состоит в том, что я не понимаю, как использовать «myEmail», который использует «MFMailComposeViewController», в моем«Документы» просматриваются правильно.Когда я вызываю «sendEmail» в моем классе «Documents», он никогда не показывает слайд окна электронной почты в поле зрения.

Я понимаю, что могу вырезать myEmail в качестве посредника и использовать методы инфраструктуры MessageUI прямо в Documentsно я не хочу так поступать.

Если бы кто-нибудь мог указать, как я неправильно использую протоколы / делегаты, я был бы очень признателен.

Код в вопросе

Это мой класс myEmail

В myEmail.h:

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

@protocol myEmailDelegate <MFMailComposeViewControllerDelegate>
    @required
        -(void)sendEmail;
        - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error;
@end

@interface myEmail : MFMailComposeViewController {
    id <myEmailDelegate> delegate;
}
@property(nonatomic,assign) id<MFMailComposeViewControllerDelegate> myEmailDelegate;

@end

В myEmail.m:

#import "myEmail.h"
#import "ConstructionDocuments.h"

@implementation myEmail

@synthesize myEmailDelegate;

-(void)sendEmail
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"mypdfdoc" ofType:@"pdf"];  
    NSData *myData = [NSData dataWithContentsOfFile:filePath];  

    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];

    controller.mailComposeDelegate = myEmailDelegate;
    [controller setSubject:@"Email Example"];
    [controller setMessageBody:@"Attached is pdf." isHTML:NO];
    [controller addAttachmentData:myData mimeType:@"application/pdf" fileName:filePath];
    [self presentModalViewController:controller animated:YES];  
    [controller release];
}

- (void)addAttachmentData:(NSData*)attachment mimeType:(NSString*)mimeType fileName:(NSString*)filename
{

}

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
    [self becomeFirstResponder];
    [self dismissModalViewControllerAnimated:YES];
}

- (void) dealloc
{ 
    [myEmailDelegate release];
    [super dealloc];
}

@end

Этопредставление, в котором я буду использовать мой класс "myEmail"

В Documents.h:

#import <UIKit/UIKit.h>
#import "myEmail.h"

@interface Documents : UIViewController <myEmailDelegate> {

}

@property(nonatomic, assign) id<MFMailComposeViewControllerDelegate> myEmailDelegate;
    - (IBAction)sendEmail;
@end

@protocol myEmailDelegate <myEmailDelegate>
    - (void) sendEmail;
@end

В Documents.m:

- (IBAction)sendEmail
{
    myEmail *mymyEmail = [[myEmail alloc] init];
    [mymyEmail setmyEmailDelegate: myEmailDelegate];
    [myEmailDelegate sendEmail];
}

1 Ответ

1 голос
/ 12 февраля 2011

IIRC вам нужно позвонить presentModalViewController: на «активном» контроллере вида, который вам не подходит.Вы можете сделать что-то вроде этого:

-(void)sendEmail:(UIViewController *)externalController
{
    // ...
    [externalController presentModalViewController:controller animated:YES];
    // ...
}

И затем вызвать это из своего действия (которое, похоже, находится внутри контроллера представления):

- (IBAction)sendEmail
{
    myEmail *mymyEmail = [[myEmail alloc] init];
    [mymyEmail setmyEmailDelegate:myEmailDelegate];
    [mymyEmail sendEmail:self];
}

Кстати, имена классов начинаются с заглавной буквыписьмо по соглашению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...