2014-02-28 86 views
0

我在我的视图控制器的viewDidLoad方法实现中有一个文本消息窗口设置。如果特定的NSString对象包含“YES”,那么我会调用我的文本消息窗口的方法并弹出。viewDidLoad弹出后的所有其他

所有这些都可以正常工作,唯一的问题是我的文本消息方法调用实际上是我的viewDidLoad中的第一件事,但由于某种原因,文本消息窗口在viewDidLoad中的其他所有内容都会弹出。

在我的viewDidLoad中,在文本消息窗口代码的下面,我设置并启动了一个AVCapture会话,并创建一个“预览图层”来显示相机所看到的内容。

尽管此代码低于文本消息窗口代码,您可以在弹出文本消息窗口之前几秒钟看到相机的预览图层。

这里是我的viewDidLoad方法的实现。注意的[self showSMS]我的短信窗口方法调用如何首先高于一切:

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    if([_justFinishedSigningUp isEqual:@"YES"]) { 

     [self showSMS];   
    } 



    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { 
     // iOS 7 
     [self prefersStatusBarHidden]; 
     [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; 
    } else { 
     // iOS 6 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; 
    } 


    _session =[[AVCaptureSession alloc]init]; 


    [_session setSessionPreset:AVCaptureSessionPresetPhoto]; 


    _inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 


    NSError *error; 


    _deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:_inputDevice error:&error]; 


    if([_session canAddInput:_deviceInput]) 
     [_session addInput:_deviceInput]; 


    _previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session]; 


    CALayer *rootLayer = [[self view]layer]; 

    [rootLayer setMasksToBounds:YES]; 


    [_previewLayer setFrame:CGRectMake(0, 0, rootLayer.bounds.size.width, rootLayer.bounds.size.height/2)]; 

    [_previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 


    [rootLayer insertSublayer:_previewLayer atIndex:0]; 


    _stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 


    [_session addOutput:_stillImageOutput]; 

    [_session startRunning]; 

    } 

然后这里有方法的实现,有助于控制文本消息窗口:

- (void)showSMS { 

    if(![MFMessageComposeViewController canSendText]) { 
     UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Your device doesn't support SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [warningAlert show]; 
     return; 
    } 

    NSArray *recipents = _usersToInviteToApp; 
    NSString *message = _textMessageInviteText; 

    MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init]; 
    messageController.messageComposeDelegate = self; 
    [messageController setSubject:@"New Message"]; 
    [messageController setRecipients:recipents]; 
    [messageController setBody:message]; 

    // Present message view controller on screen 
    [self presentViewController:messageController animated:YES completion:nil]; 
} 


- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult) result 
{ 
    switch (result) { 
     case MessageComposeResultCancelled: 
      break; 

     case MessageComposeResultFailed: 
     { 
      UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to send SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [warningAlert show]; 
      break; 
     } 

     case MessageComposeResultSent: 
      break; 

     default: 
      break; 
    } 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

回答

1

你加载的东西与animated:YESviewDidLoad,在什么都在屏幕上之前发生的([self presentViewController:messageController animated:YES completion:nil];

您是否尝试过将任何移动到viewDidAppear或者,如果您想要在屏幕上显示所有内容,请尝试在-(void)showSMS方法中设置animated:NO

+0

我试图关闭动画,但没有帮助。如果我尝试使用viewDidAppear,我用它来替换viewDidLoad,还是应该把它放在viewDidLoad之上?在viewDidLoad下面? – user3344977

+0

你可以确认viewDidAppear是否替换viewDidLoad,如果不是应该放在哪里? – user3344977

+0

它不会替代'viewDidLoad',它可以和它一起工作。无论您在物理上放置代码的哪个位置都无关紧要。检查这篇文章了解更多一点:http://stackoverflow.com/questions/5562938/looking-to-understand-the-ios-uiviewcontroller-lifecycle – Stonz2

相关问题