Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从另一个类(MFMailComposeViewController)显示模式视图_Iphone_Ios - Fatal编程技术网

Iphone 从另一个类(MFMailComposeViewController)显示模式视图

Iphone 从另一个类(MFMailComposeViewController)显示模式视图,iphone,ios,Iphone,Ios,我正在尝试创建一个类,该类将负责使用MFMailComposeViewController发送电子邮件,以便我可以从我的应用程序中的差异视图控件使用此方法 这个类叫做apoio 在这个类中有下面的方法 -(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico { if (![MFMailComposeViewController canSendMail]) { // show message box for user that SMS c

我正在尝试创建一个类,该类将负责使用MFMailComposeViewController发送电子邮件,以便我可以从我的应用程序中的差异视图控件使用此方法

这个类叫做apoio

在这个类中有下面的方法

-(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico {

if (![MFMailComposeViewController canSendMail]) {
    // show message box for user that SMS cannot be sent
} else {
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [picker setSubject:@"Dashboard"];

    [picker addAttachmentData:_pdfGrafico mimeType:@"application/pdf" fileName:@"grafico.pdf"];

    NSString *emailBody = @"Anexando gráfico";
    [picker setMessageBody:emailBody isHTML:NO];        

     [self presentModalViewController:picker animated:YES];         
       }
}
我有另一个视图控制器,当用户单击电子邮件按钮时,它调用apoio方法。这就是下面的代码

-(IBAction) enviarGraficoPorEmail {

Apoio *apoio = [[Apoio alloc] init];
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer]];
}
但我不知道为什么,电子邮件视图没有出现。该方法被调用为correct,因为我进行了调试等等

如果我将代码从apoio方法复制到enviragraficoporemail方法,那么一切都会很完美

但我不想这样做,因为我会从其他人那里发送电子邮件


我做错了什么???

您需要调用[self-presentModalViewController:picker animated:YES]
从UIViewController类中,它将向您显示电子邮件生成器,您可以这样做,无论何时从某个视图控制器调用,您都可以传递其引用,并且您可以将上面的行更改为


[调用控制器presentModalViewController:picker动画:是]

你可以用几种不同的方法来做

选项1:将调用的视图控制器作为参数传递给类方法

-(IBAction) enviarGraficoPorEmail {
Apoio *apoio = [[Apoio alloc] init];
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer] callingController:self];
}

-(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico callingController:(UIViewController*)_callingController {
...
[_callingController presentModalViewController:picker animated:YES];
...
}
选项2:为调用的视图控制器添加类变量

-(IBAction) enviarGraficoPorEmail {
Apoio *apoio = [[Apoio alloc] init];
apoio.callingController = self;
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer]];
}

-(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico callingController:(UIViewController*)_callingController {
...
[callingController presentModalViewController:picker animated:YES];
...
}
然后将callingController作为一个retain属性添加到类中,将其初始化为nil,并在dealloc中释放它


选项1可能是满足您需求的更好方法

非常感谢!。它现在正在工作,但我仍然有一个问题

我的泛型类上有一个方法,该方法负责隐藏mailController

- (void)mailComposeController:(MFMailComposeViewController*)controller      didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{
switch (result)
{
    case MFMailComposeResultCancelled:
        break;
    case MFMailComposeResultSaved:
        break;
    case MFMailComposeResultSent:
        // FAILS
        [self.parentViewController dismissModalViewControllerAnimated:YES];
        break;
    case MFMailComposeResultFailed:
        break;
    default:
        break;
}
[self dismissModalViewControllerAnimated:YES];
}
在创建mailController的方法中,具有

picker.mailComposeDelegate = self;
我试着换成

picker.mailComposeDelegate = _callingController.self;
我已经在泛型类上设置了MFMailComposeViewControllerDelegate

但它只在我复制didFinishWithResult方法并将其放在origin控制器上时起作用,这不是我的意图,因为我想将所有这些代码放在一个泛型类上


我做错了什么?

好的,这是对你第二个问题的回答(你把它作为对第一个问题的回答发布了出来)

以下是我将如何设置这一切:

在调用视图控制器.h文件中:

@interface MyViewController : UIViewController <MyMailDelegate> {
    Apoio *apoio;
}
在Apoio.h文件中

@protocol MyMailDelegate
@required
-(void) enviarCompleto;
@end

@interface OfferObject : NSObject {
    UIViewController <MyMailDelegate> *callingController;
}

@property (nonatomic, retain) UIViewController <MyMailDelegate> *callingController;
然后不要忘记在init上执行此操作:

callingController = nil;
关于dealloc:

[callingController release];

还有,别忘了你最重要的一步:向上投票给我的两个答案:)

嗯。。。但问题是,我希望使该方法通用,以便可以从其他视图控制器调用它。您知道如何动态获取CallingController的名称吗?您只需要在调用泛型方法时将self作为参数传递,self引用您当前的UIViewController实例,不幸的是它仍然不工作:(.问题是方法-(void)mailComposeController:(MFMailComposeViewController*)控制器didFi…..由电子邮件编写器的委托自动调用。当按下“发送”或“取消”按钮时,会调用此方法。我如何对此作出响应?这就是问题所在。在apoio类中,我在该方法上放置了一个断点,但它从未被调用。但如果我将此方法放置在源类上,则该方法为called。非常感谢Joel的耐心。顺便说一句,我试着投赞成票,但我需要15分才能被允许投票。方法-(void)mailComposeController:(MFMailComposeViewController*)控制器未完成结果:(MFMailComposeResult)结果错误:(N错误*)错误是来自MFMailComposeViewController的协议。它不是我调用的方法。它是从MFMAILCOMPOSEVIEWCONTROLLEPICKER.mailComposeDelegate=self自动调用的。应设置委托,以便类apoio接收委托回调方法。如果希望委托是原始调用方,请执行picker.mailComposeDelegate=callingController。但是我提供的协议模式允许您在类上拥有委托,它将使用enviarCompleto为您回调调用方。如果需要,您可以向enviarCompleto添加一个参数以将结果传回。
callingController = nil;
[callingController release];