ViewWillAppear获得两次调用

时间:2013-11-14 00:40:49

标签: ios objective-c uiviewcontroller viewwillappear

我正在使用故事板在iOS 7上编写应用程序。

我有一个导航控制器作为我的根视图控制器,我在其中嵌入了一个视图控制器。

当应用程序加载时,viewDidLoad被调用一次,viewWillAppear被调用一次。这是正确的(我也检查数据并更新视图中的视图)。

但是,在我的视图控制器中,我有一个按钮,允许用户使用'MFMessageComposeViewController'控制器通过短信/文本共享信息。

所以这里的代码是

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];
}

并且委托函数是

- (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

}

然而,当我调用dismissViewControllerAnimated时,viewDidAppear方法被调用两次。你知道为什么会发生这种情况,因为这是两次检查数据,然后在我的视图中添加两次而不只是一次吗?

谢谢, VARUN

1st - ViewDidAppear的Stacktrace是

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 - ViewDidAppear的Stacktrace是

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 个答案:

答案 0 :(得分:1)

我使用的是旧版本的第三方库,导致viewdidappear被调用两次。通过更新库可以解决此问题。

答案 1 :(得分:0)

如果您希望代码执行一次,您可以提供Bool。例如

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