显示密码/ Pincode启动应用程序 – 故事板

我试图启动应用程序时显示密码/ pincode(模式视图控制器)。 您可能会看到AppDelegate.h中的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (![[NSUserDefaults standardUserDefaults] boolForKey:@"passcode_in"]) { //display passcode screen UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PasscodeViewController"]; [vc setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentModalViewController:vc animated:NO]; } else { NSLog(@"No Passcode Screen"); } return YES; } 

问题是,AppDelegate不支持显示模式视图控制器(presentModalViewController)。 我不打算使用.xib文件,只有Storyboard为我的应用程序。 有人知道它有什么问题吗? 任何build议表示赞赏。

解决

我遵循给我的以前发布的问题之一的指示https://stackoverflow.com/a/10303870/1344459我解决了这个问题,只添加一些代码到AppDelegate.m中的两个方法applicationDidEnterBackgroundapplicationWillTerminate PinCodeViewController(模态)启动应用程序。 现在它工作得如此顺利。

我解决同样的问题的方法是在storyboard中创build另一个视图控制器,通过自定义的segue将其链接到我的初始视图控制器,并在ViewController的viewDidLoad方法中调用segue。 LoginSegue.h

 #import <UIKit/UIKit.h> @interface LoginSegue : UIStoryboardSegue @end 

LoginSegue.m

  #import "LoginSegue.h" @implementation LoginSegue - (void)perform { UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; [UIView transitionWithView:src.navigationController.view duration:0.0 options:UIViewAnimationTransitionNone animations:^{ [src.navigationController presentViewController:dst animated:NO completion:nil]; } completion:NULL]; } @end 

然后在故事板中,select您的segue,并将segue类设置为LoginSegue,并将标识符设置为任何您喜欢的。 我的是“login”。 并在viewDidLoad中包含以下内容:

 [self performSegueWithIdentifier:@"toLogin" sender:self]; 

presentModalViewController是UIViewController类的一个方法。 你的AppDelegate是一个NSObject或UIResponder,所以不会识别它。

你应该出示你的密码/ PIN码视图非模态,把它放在你的故事板的第一个UIViewController。

如果你需要以模态方式显示,即使不需要,然后从你的故事板的第一个UIViewController而不是从AppDelegate展示你的模态视图。

在你的UIViewController中你应该这样写:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PasscodeViewController"]; [vc setModalPresentationStyle:UIModalPresentationFullScreen]; [self performSelector:@selector(presentModal) withObject:nil afterDelay:0.0]; } - (void)presentModal { [self presentViewController:vc animated:NO completion:NULL]; } 

注意你需要执行select器。 如果你不使用它,你的视图将不会显示。 请注意, presentModalViewController现在已被弃用,请使用presentViewController

如果密码是login的先决条件,那么将其作为loginpath的一部分可能是有意义的。

要在故事板中执行此操作,请绘制一个导航控制器,删除默认获取的UITableViewController根目录,并将您的PasscodeViewController设置为根目录。 然后从那里添加一个push segue到LoginViewController。

PasscodeViewController中的逻辑与此处所讨论的类似:在viewWillAppear上:它可以检查密码要求是否被满足。 如果需要的话,让密码视图出现,并做它的工作。 如果您已经拥有密码,请执行LoginViewController。 如果两者都不需要,请解雇。

最后,一旦密码被PasscodeViewController收集,它可以决定是否需要login(执行推入到LoginViewController),或者只是启动应用程序(解雇)。

希望这是有帮助的。