1
votes

I am writing an application on iOS 7 using storyboards.

I have a navigation controller as my root view controller and I embed a view controller within it.

When the application loads, viewDidLoad gets called once and viewWillAppear gets called once. This is correct (also I check for data & update the view in view will appear).

However, in my view controller, i have a button which allows the user to share the information via SMS/text using the 'MFMessageComposeViewController' controller.

So the code here is

MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];

if([MFMessageComposeViewController canSendText])

{ 
    controller.body = [NSString stringWithFormat:@"Some Text Here"];

    controller.messageComposeDelegate = self;

    [self presentViewController:controller animated:YES completion:nil];
}

and the delegate function is

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
 switch (result) {
      case MessageComposeResultCancelled:
           NSLog(@"Cancelled");
           break;
      case MessageComposeResultSent:
           NSLog(@"Message Sent");
           break;
      default:
           break;
 }

[self dismissViewControllerAnimated:YES completion:nil];
//[controller dismissViewControllerAnimated:YES completion:nil]; //tried this as well but same result

}

However, when i called dismissViewControllerAnimated.. the viewDidAppear method is being called twice. Do you know why this is happening as this is checking data twice and there by adding things twice to my view instead of only once?

Thanks, Varun

1st - Stacktrace of ViewDidAppear is

0   Sweep                               0x0010a8f1 -[GoogleMapsViewController viewDidAppear:] + 56
1   UIKit                               0x2fd3673f <redacted> + 410
2   UIKit                               0x2fde6657 <redacted> + 182
3   UIKit                               0x2fd3673f <redacted> + 410
4   UIKit                               0x2fd36bcd <redacted> + 264
5   Sweep                               0x000e9909 -[RESideMenu viewDidAppear:] + 88
6   UIKit                               0x2fd3673f <redacted> + 410
7   UIKit                               0x2fd36bcd <redacted> + 264
8   UIKit                               0x2fe3321b <redacted> + 1682
9   UIKit                               0x2fe32ab7 <redacted> + 170
10  UIKit                               0x2fe329e3 <redacted> + 74
11  UIKit                               0x2fe328c9 <redacted> + 288
12  UIKit                               0x2fe323d9 <redacted> + 944
13  UIKit                               0x2fd53ab7 <redacted> + 178
14  UIKit                               0x2fd539cf <redacted> + 66
15  QuartzCore                          0x2f9a9413 <redacted> + 234
16  libdispatch.dylib                   0x37dd90af <redacted> + 22
17  libdispatch.dylib                   0x37ddb9a9 _dispatch_main_queue_callback_4CF + 268
18  CoreFoundation                      0x2d5625b1 <redacted> + 8
19  CoreFoundation                      0x2d560e7d <redacted> + 1308
20  CoreFoundation                      0x2d4cb471 CFRunLoopRunSpecific + 524
21  CoreFoundation                      0x2d4cb253 CFRunLoopRunInMode + 106
22  GraphicsServices                    0x322052eb GSEventRunModal + 138
23  UIKit                               0x2fd80845 UIApplicationMain + 1136
24  Sweep                               0x00098299 main + 116
25  libdyld.dylib                       0x37dedab7 <redacted> + 2

)

2nd - Stacktrace of ViewDidAppear is

0   Sweep                               0x0010a8f1 -[GoogleMapsViewController viewDidAppear:] + 56
1   UIKit                               0x2fd3673f <redacted> + 410
2   UIKit                               0x2fde6657 <redacted> + 182
3   UIKit                               0x2fd3673f <redacted> + 410
4   CoreFoundation                      0x2d4e0803 <redacted> + 50
5   CoreFoundation                      0x2d4da21d <redacted> + 220
6   UIKit                               0x2fd3687b <redacted> + 726
7   UIKit                               0x2fd36bcd <redacted> + 264
8   UIKit                               0x2fe3321b <redacted> + 1682
9   UIKit                               0x2fe32ab7 <redacted> + 170
10  UIKit                               0x2fe329e3 <redacted> + 74
11  UIKit                               0x2fe328c9 <redacted> + 288
12  UIKit                               0x2fe323d9 <redacted> + 944
13  UIKit                               0x2fd53ab7 <redacted> + 178
14  UIKit                               0x2fd539cf <redacted> + 66
15  QuartzCore                          0x2f9a9413 <redacted> + 234
16  libdispatch.dylib                   0x37dd90af <redacted> + 22
17  libdispatch.dylib                   0x37ddb9a9 _dispatch_main_queue_callback_4CF + 268
18  CoreFoundation                      0x2d5625b1 <redacted> + 8
19  CoreFoundation                      0x2d560e7d <redacted> + 1308
20  CoreFoundation                      0x2d4cb471 CFRunLoopRunSpecific + 524
21  CoreFoundation                      0x2d4cb253 CFRunLoopRunInMode + 106
22  GraphicsServices                    0x322052eb GSEventRunModal + 138
23  UIKit                               0x2fd80845 UIApplicationMain + 1136
24  Sweep                               0x00098299 main + 116
25  libdyld.dylib                       0x37dedab7 <redacted> + 2

)

2
Post more code for each class.James Campbell
What are the call stack for each invocation of -viewDidAppear:?Jeffery Thomas
@JefferyThomas I added the stack trace for both viewDidAppear calls. Hope this helps.goelv
Are you containing GoogleMapsViewController inside of RESideMenu? Somehow RESideMenu is passing the notification down to GoogleMapsViewController.Jeffery Thomas
Yes RESideMenu has a content view controller which is my GoogleMapsViewController. What do I need to change?goelv

2 Answers

1
votes

I was using an older version of a third party library which was causing viewdidappear to be called twice. This problem is fixed by updating the library.

0
votes

If you want your code execute once ,you can give a Bool .for example

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (!_loaded)
    {
       _loaded = YES;
       ///do want you wanna to do.
    }
}