3
votes

I am having a problem with updating one of my older apps, this is only since I updated to Xcode 4.5 and trying on iOS6 it gives the following error;

*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <MainView: 0x1e818620; frame = (0 0; 320 476); autoresize = RM+BM; layer = <CALayer: 0x1e818750>> is associated with <MainViewController: 0x1e811850>. Clear this association before associating this view with <UIViewController: 0x21149860>.'

* First throw call stack: (0x377d82a3 0x35ae897f 0x377d81c5 0x38b0dd7b 0x38b0dc6b 0x1dc25 0x38b940ad 0x38b9405f 0x38b9403d 0x38b938f3 0x38b93de9 0x38abc5f9 0x38aa9809 0x38aa9123 0x37c5c5a3 0x37c5c1d3 0x377ad173 0x377ad117 0x377abf99 0x3771eebd 0x3771ed49 0x37c5b2eb 0x38afd301 0x1bf03 0x1bea8) libc++abi.dylib: terminate called throwing an exception [Switching to process 9219 thread 0x2403]

I think it is here that causes the issue;

 mailComposer = [[UIViewController alloc] init];
[mailComposer setView:self];
[mailComposer setModalTransitionStyle: UIModalTransitionStyleCoverVertical];




MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];   picker.mailComposeDelegate = self;

As it is when I click the button which should take me to the MFMail composer that is when the app crashes out.

Any ideas?

Thanks in advance

Edit - If I remove the first 3 lines the app does not crash out, however the mail view does not load... here are the entire code;

    // The actual mail window call



mailComposer = [[UIViewController alloc] init];
[mailComposer setView:self];
[mailComposer setModalTransitionStyle: UIModalTransitionStyleCoverVertical];




MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];   picker.mailComposeDelegate = self;

[picker setSubject:@"Hello How are you"];

    // Fill out the email body text
NSString *pageLink = @"http://www.apple.com"; 
NSString *iTunesLink = @"http://itunes.apple.com/gb/artist/randomer";
NSString *content = @"blah blah"; 


NSString *emailFileName = [NSString stringWithFormat:@"email_.html"];


NSString *emailFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: emailFileName];
NSString *body = [NSString stringWithContentsOfFile:emailFilePath encoding:NSUTF8StringEncoding error:nil];


body = [body stringByReplacingOccurrencesOfString:@"//TEXT_PLACEHOLDER//" withString:@"replace here"];
body = [body stringByReplacingOccurrencesOfString:@"//FRIENDNAME_PLACEHOLDER//" withString:pageLink];
body = [body stringByReplacingOccurrencesOfString:@"//ITUNES_PLACEHOLDER//" withString:  iTunesLink];
body = [body stringByReplacingOccurrencesOfString:@"//PASSKEY_PLACEHOLDER//" withString:  yourPassword];
body = [body stringByReplacingOccurrencesOfString:@"//PHONETIC_PLACEHOLDER//" withString:  yourPhoneticPassword];




[picker setMessageBody:body isHTML:YES];    
picker.navigationBar.barStyle = UIBarStyleBlack;    
[mailComposer presentModalViewController:picker animated:YES];
[picker release];

}

//HANDLE THE MAIL EVENTS
////////////////////////
  • (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { // Notifies users about errors associated with the interface switch (result) { case MFMailComposeResultCancelled: break; case MFMailComposeResultSaved: break; case MFMailComposeResultSent: break; case MFMailComposeResultFailed: break;

    default:
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Email" message:@"Sending Failed - Unknown Error :-("
                                                       delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
        [alert release];
    }
    
        break;
    

    } [mailComposer dismissModalViewControllerAnimated:YES]; //[mailComposer.view.superview removeFromSuperview]; }

1
What this line does? What's self here? [mailComposer setView:self];pronvit
you just need the last line. what are the first 3 lines for ?Raptor
Any ideas? Struggling here :(user1695971
Well, found a temporary workaround...Go back and compile in Xcode 4.2.1! And forget 4.5 until a fix is found for it!user1695971

1 Answers

1
votes

The main thing to get the mail compose view controller to show is to present it using the currently-active UIViewController. You didn't share enough of your code for this to be clear to me, but if self is a UIViewController in that context, you'd need to do:

[self presentViewController:picker animated: YES completion:nil];

If self isn't a UIViewController, replace self in the code above with a variable referencing the current UIViewController.