出现键盘时 MFMailComposeViewController didFinishWithResult 问题
MFMailComposeViewController didFinishWithResult issue when the keyboard appears
我有一个 MFMailComposeViewController 的标准实现。
我已经设置了正确的委托协议,并且在 didFinishWithResult 方法上发生了日志。
参见:
mailComposer = [[MFMailComposeViewController alloc] init];
[mailComposer setSubject:emailTitle];
[mailComposer setMessageBody:messageBody isHTML:YES];
mailComposer.mailComposeDelegate = self;
[[self getController] presentViewController:mailComposer animated:YES completion:NULL];
- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
NSLog(@"mail dismiss");
[[self getController] dismissViewControllerAnimated:YES completion:NULL];
}
邮件编辑器正确显示,一切正常。意思是,如果我按下 "cancel" 按钮,则会调用 didFinishWithResult 方法并关闭 mailComposer。
但是,如果我尝试键入任何内容,例如 TO: 电子邮件地址,或邮件编辑器本身中的任何其他内容,感觉键盘出现正在删除我的视图控制器的委托操作, 因为 "cancel" 和 "send" 按钮不触发任何动作.
有什么想法吗?这让我发疯:/
干杯
编辑
这是 getController 的代码:
- (UIViewController *) getController
{
Class vcc = [UIViewController class];
UIResponder *responder = self;
while ((responder = [responder nextResponder]))
if ([responder isKindOfClass: vcc])
return (UIViewController *)responder;
return nil;
}
像这样设置一个开关来捕获来自邮件编辑器的结果:
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
switch (result) {
case MFMailComposeResultCancelled:
// User tapped cancel button
break;
case MFMailComposeResultSaved:
// User saved email
break;
case MFMailComposeResultSent:
// User sent email
break;
case MFMailComposeResultFailed:
break;
default:
break;
}
[self dismissViewControllerAnimated:YES completion:NULL];
}
当 UITextField 成为 FirstResponder 时,您的控制器将收到 resignFirstResponder。
为什么要使用方法"getController"?在显示 MFMailComposeViewController.
的 ViewController 上创建 属性
我推荐这个实现:
- (void) presentMailViewController
if([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *mail = [MFMailComposeViewController new];
mail.mailComposeDelegate = self;
mail.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;;
[self.navigationController presentViewController:mail animated:YES completion:nil];
}
}
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
if(error)
{
//...
}
[self dismissViewControllerAnimated:YES completion:nil];
}
我建议您阅读此页面:
Code Naming Basics
我有一个 MFMailComposeViewController 的标准实现。
我已经设置了正确的委托协议,并且在 didFinishWithResult 方法上发生了日志。
参见:
mailComposer = [[MFMailComposeViewController alloc] init];
[mailComposer setSubject:emailTitle];
[mailComposer setMessageBody:messageBody isHTML:YES];
mailComposer.mailComposeDelegate = self;
[[self getController] presentViewController:mailComposer animated:YES completion:NULL];
- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
NSLog(@"mail dismiss");
[[self getController] dismissViewControllerAnimated:YES completion:NULL];
}
邮件编辑器正确显示,一切正常。意思是,如果我按下 "cancel" 按钮,则会调用 didFinishWithResult 方法并关闭 mailComposer。
但是,如果我尝试键入任何内容,例如 TO: 电子邮件地址,或邮件编辑器本身中的任何其他内容,感觉键盘出现正在删除我的视图控制器的委托操作, 因为 "cancel" 和 "send" 按钮不触发任何动作.
有什么想法吗?这让我发疯:/
干杯
编辑
这是 getController 的代码:
- (UIViewController *) getController
{
Class vcc = [UIViewController class];
UIResponder *responder = self;
while ((responder = [responder nextResponder]))
if ([responder isKindOfClass: vcc])
return (UIViewController *)responder;
return nil;
}
像这样设置一个开关来捕获来自邮件编辑器的结果:
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
switch (result) {
case MFMailComposeResultCancelled:
// User tapped cancel button
break;
case MFMailComposeResultSaved:
// User saved email
break;
case MFMailComposeResultSent:
// User sent email
break;
case MFMailComposeResultFailed:
break;
default:
break;
}
[self dismissViewControllerAnimated:YES completion:NULL];
}
当 UITextField 成为 FirstResponder 时,您的控制器将收到 resignFirstResponder。
为什么要使用方法"getController"?在显示 MFMailComposeViewController.
的 ViewController 上创建 属性我推荐这个实现:
- (void) presentMailViewController
if([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *mail = [MFMailComposeViewController new];
mail.mailComposeDelegate = self;
mail.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;;
[self.navigationController presentViewController:mail animated:YES completion:nil];
}
}
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
if(error)
{
//...
}
[self dismissViewControllerAnimated:YES completion:nil];
}
我建议您阅读此页面: Code Naming Basics