Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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/6/jenkins/5.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 MailComposer类UIViewController解除了ModalViewController激活的问题_Iphone_Email_Uiviewcontroller_Transparent - Fatal编程技术网

iPhone MailComposer类UIViewController解除了ModalViewController激活的问题

iPhone MailComposer类UIViewController解除了ModalViewController激活的问题,iphone,email,uiviewcontroller,transparent,Iphone,Email,Uiviewcontroller,Transparent,我创建了一个类来启动MailComposer,这样我的iPhone应用程序在生成各种类型的电子邮件时只有一个地方:一些带有附件,一些没有。有些是预先填写的地址,有些不是 我不希望我的类实现UIViewController,但它必须实现,这样它才能成为MailComposer的委托。否则,调用my类的视图控制器本身就必须是MailComposer的委托,这就违背了目的 让我的类成为视图控制器的缺点是,它必须先加载到屏幕上,然后才能使用MailComposer。不幸的是,视图控制器不能是透明的。其效

我创建了一个类来启动MailComposer,这样我的iPhone应用程序在生成各种类型的电子邮件时只有一个地方:一些带有附件,一些没有。有些是预先填写的地址,有些不是

我不希望我的类实现UIViewController,但它必须实现,这样它才能成为MailComposer的委托。否则,调用my类的视图控制器本身就必须是MailComposer的委托,这就违背了目的

让我的类成为视图控制器的缺点是,它必须先加载到屏幕上,然后才能使用MailComposer。不幸的是,视图控制器不能是透明的。其效果是,在MailComposer出现之前,屏幕上的任何内容都会被纯白的视图控制器覆盖一段时间

我也许可以接受,但不是这样:在MailComposer离开后,我的空白视图控制器占据了屏幕。我应该能够通过称之为:

[self.parentViewController dismissModalViewControllerAnimated:NO];
但这是一个可怕的死亡:“加载43365个堆栈帧…”

我的类——预填充然后启动MailComposer的UIViewController——是否丢失了其parentViewController?它不是零,因为我已经测试过了

从当前视图控制器中启动时

// My class is called Email.
Email *oEmail = [[[Email alloc] init] retain];
// Red, to remind myself that I'd like to someday learn to make it transparent.
oEmail.view.backgroundColor = [UIColor redColor]; 
// Pre-fill whatever fields you want, and specify attachments.
oEmail.EmailSubject = @"I am truly stumped";
// This has to go on screen first.
[self presentModalViewController:oEmail animated:NO];
// Then this can happen, which brings up the MailComposer.
[oEmail f_SendEmail];
// Commenting out the next line didn't help, so I turned it back on.
[oEmail release];
在类中,您需要mailComposeController:didFinishWithResult:error:方法使MailComposer消失,要实现这一点,该类必须是MFMailComposeViewControllerDelegate。下面是这里发生的事情:

// This gets rid of the mail composer.
[self dismissModalViewControllerAnimated:YES];

// This never fails to get rid of other modal view controllers when called
// from within those controllers, but boy does it not work here.
[self.parentViewController dismissModalViewControllerAnimated:NO];
如果你能帮助我,我将非常感激

而不是打电话

[self.parentViewController dismissModalViewControllerAnimated:NO];
我将为您的“电子邮件”控制器设置一名代表。 创建新项目时,可以在“FlipSide”应用程序模板中看到这种连接的示例

基本上,您将为电子邮件控制器设置一个代理:

Email *oEmail = [[[Email alloc] init] retain];
oEmail.view.backgroundColor = [UIColor redColor]; 
oEmail.EmailSubject = @"I am truly stumped";
[self presentModalViewController:oEmail animated:NO];
[oEmail f_SendEmail];
[oEmail setDelegate:self];
[oEmail release];
然后在Email.h文件中:

@protocol EmailDelegate
-(void)emailDidFinish;
@end

@implementation Email : UIViewController {
      // Other stuff
      id <EmailDelegate> delegate;
}

@property (nonatomic, assign) id <EmailDelegate> delegate;

@end
最后,在原始视图控制器中,确保已在.h文件中,然后具有:

-(void)emailDidFinish {
   [self dismissModal...];
}

希望能有所帮助。

我也有同样的问题,我用不同的方法解决了

我创建了一个弹出当前ViewController的函数。 在h:

-(void)ics;
在cpp中:

-(void)ics{
  //[self.navigationController popViewControllerAnimated:NO];   
  [self.navigationController popToRootViewControllerAnimated:YES];
}
在解雇了邮件撰写者后,他称之为:

[self dismissModalViewControllerAnimated:YES];
[self ics];

我将对此进行测试。有趣的我真的不喜欢授权,因为如果一个对象必须将责任移交给其他对象,它怎么能真正独立?然而,MailComposer是一个Apple创建的对象,没有关联的代码模块,我们可以在其中添加自定义代码。因此,我们将另一个对象作为委托,然后可以在那里编写代码。问题是,您必须将该代码放在每个可能显示MailComposer的ViewController中。在我测试之前,我无法判断您建议的解决方案是否解决了这个问题。请注意,“加载43365堆栈帧…”表示无限递归。如果您查看调试器,您应该会看到导致这种情况的方法循环。而且,“视图控制器不能透明”在技术上是错误的。视图控制器只是用于管理视图逻辑的对象。视图本身可以是透明、半透明或非全屏的。您所指的是-presentModalViewController:animated:方法,当控制器在屏幕上滑动时,它会在控制器的视图后面放置一个不透明的白色视图。
[self dismissModalViewControllerAnimated:YES];
[self ics];