我在我的视图控制器的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];
}
我试图关闭动画,但没有帮助。如果我尝试使用viewDidAppear,我用它来替换viewDidLoad,还是应该把它放在viewDidLoad之上?在viewDidLoad下面? – user3344977
你可以确认viewDidAppear是否替换viewDidLoad,如果不是应该放在哪里? – user3344977
它不会替代'viewDidLoad',它可以和它一起工作。无论您在物理上放置代码的哪个位置都无关紧要。检查这篇文章了解更多一点:http://stackoverflow.com/questions/5562938/looking-to-understand-the-ios-uiviewcontroller-lifecycle – Stonz2