I am trying to send email from within my iOS app.
The idea is to have one class SendMessage
which all classes use to send email from within the app. It is a subclass of NSObject
and is a MFMailComposeViewControllerDelegate
This is what the SendMessage class looks like
@implementation SendMessage
- (void) sendEmailFromViewController : (UIViewController *)viewController withSubject : (NSString *) subject withRecipient : (NSString *)recipient withMessage : (NSString *)message withCompletionBlock : (void(^)(void))completionBlock withFailure : (void(^)(void))failure {
self.viewController = viewController;
if (![MFMailComposeViewController canSendMail]){
if (failure)
failure();
}
else {
MFMailComposeViewController *messageController = [[MFMailComposeViewController alloc] init];
messageController.mailComposeDelegate = self.viewController;
[messageController setSubject:subject];
[messageController setToRecipients:[NSArray arrayWithObject:recipient]];
[messageController setMessageBody:message isHTML:NO];
[self.viewController presentModalViewController:messageController animated:YES];
}
}
-(void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
[self.viewController dismissViewControllerAnimated:YES completion:nil];
}
@end
I am trying to call the class using:
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 3) {
SendMessage *sendFeedback = [[SendMessage alloc] init];
[sendFeedback sendEmailFromViewController:self withSubject:@"App Feedback" withRecipient:@"ashisha@moj.io" withMessage:@"This is app feedback" withCompletionBlock:nil withFailure:nil];
}
}
The problem is that although I am able to send the email, the delegate method is not being called. How do I fix it ?
您的委托是UIViewController
,因此在此实现mailComposeController:didFinishWithResult:error
委托方法。
I think the problem is that your object sendFeedback
is released at the end of the block.
The best solution is to create singleton object and than use it
In the SendMessage.h
file add
+ (instancetype) sharedManager;
In the SendMessage.m
file add
+ (instancetype) sharedManager{
static SendMessage* instance = nil;
if(!instance){
instance = [[SendMessage alloc] init];
}
return instance;
}
Than you can use your singleton anywhere in the code
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 3) {
SendMessage *sendFeedback = [SendMessage sharedManager];
[sendFeedback sendEmailFromViewController:self withSubject:@"App Feedback" withRecipient:@"ashisha@moj.io" withMessage:@"This is app feedback" withCompletionBlock:nil withFailure:nil];
}
}
Also messageController.mailComposeDelegate
must be set to self
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.