iPhone MailComposer类UIViewController解除了ModalViewController激活的问题
我创建了一个类来启动MailComposer,这样我的iPhone应用程序在生成各种类型的电子邮件时只有一个地方:一些带有附件,一些没有。有些是预先填写的地址,有些不是 我不希望我的类实现UIViewController,但它必须实现,这样它才能成为MailComposer的委托。否则,调用my类的视图控制器本身就必须是MailComposer的委托,这就违背了目的 让我的类成为视图控制器的缺点是,它必须先加载到屏幕上,然后才能使用MailComposer。不幸的是,视图控制器不能是透明的。其效果是,在MailComposer出现之前,屏幕上的任何内容都会被纯白的视图控制器覆盖一段时间 我也许可以接受,但不是这样:在MailComposer离开后,我的空白视图控制器占据了屏幕。我应该能够通过称之为:iPhone MailComposer类UIViewController解除了ModalViewController激活的问题,iphone,email,uiviewcontroller,transparent,Iphone,Email,Uiviewcontroller,Transparent,我创建了一个类来启动MailComposer,这样我的iPhone应用程序在生成各种类型的电子邮件时只有一个地方:一些带有附件,一些没有。有些是预先填写的地址,有些不是 我不希望我的类实现UIViewController,但它必须实现,这样它才能成为MailComposer的委托。否则,调用my类的视图控制器本身就必须是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];