启动应用程序时显示Passcode / Pincode - Storyboard

时间:2012-04-24 22:50:45

标签: iphone objective-c ios login storyboard

我正在尝试在启动应用程序时显示密码/密码(模态视图控制器)。您可以在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。有人知道它有什么问题吗?任何建议都表示赞赏。

分辨

我按照之前发布的一个问题的说明进行了https://stackoverflow.com/a/10303870/1344459我通过在两个方法 applicationDidEnterBackground applicationWillTerminate 中添加了一些代码来解决了这个问题。启动应用程序时,AppDelegate.m用于PinCodeViewController(模态)。现在它的工作非常顺利。

3 个答案:

答案 0 :(得分:0)

我对同一问题的解决方案是在storyboard中创建另一个视图控制器,通过自定义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

然后在storyboard中,选择你的segue并将segue类设置为LoginSegue,并将标识符设置为你喜欢的任何内容。我是@“登录”。并在viewDidLoad中包含以下内容:

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

答案 1 :(得分:0)

presentModalViewControllerUIViewController类的方法。您的AppDelegate是NSObject或UIResponder,因此无法识别它。

您应该以非模态方式显示密码/密码视图,并将其放在故事板的第一个UIViewController中。

如果您需要以模态方式显示它,即使没有必要,也可以从Storyboard的第一个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];
}

N.B。您需要performSelector。如果您不使用它,您的视图将不会显示。 请注意,presentModalViewController现已弃用,请改用presentViewController

答案 2 :(得分:0)

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

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

PasscodeViewController中的逻辑类似于此处讨论的内容:在viewWillAppear上:它可以检查是否满足密码要求。如果需要,请显示密码视图并执行此操作。如果您已经有密码执行segue到LoginViewController。如果两者都不需要,请解雇。

最后,一旦密码被PasscodeViewController收集,它就可以决定是否要求登录(执行push segue到LoginViewController),或者只是启动应用程序(解散)。

希望这有帮助。