Reputation: 14925
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:@"[email protected]" 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 ?
Upvotes: 0
Views: 156
Reputation: 502
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:@"[email protected]" withMessage:@"This is app feedback" withCompletionBlock:nil withFailure:nil];
}
}
Also messageController.mailComposeDelegate
must be set to self
Upvotes: 0
Reputation: 13766
Your delegate is the UIViewController
, so implement the mailComposeController:didFinishWithResult:error
delegate method there.
Upvotes: 1