0

我试图在启动应用程序时显示密码/密码(模式视图控制器)。您可能会在 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我通过仅在 AppDelegate.m 中的两个方法applicationDidEnterBackgroundapplicationWillTerminate中为 PinCodeViewController(modal)添加一些代码来解决了这个问题启动应用程序。现在它工作得非常顺利。

4

3 回答 3

0

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

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

PasscodeViewController 中的逻辑与这里讨论的类似: On viewWillAppear:它可以检查是否满足密码要求。如果需要,让密码视图出现并完成它的工作。如果您已经有密码,请执行对 LoginViewController 的 segue。如果两者都不需要,请解雇。

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

希望这会有所帮助。

于 2012-04-25T00:11:52.177 回答
0

我对同一问题的解决方案是在情节提要中创建另一个视图控制器,通过自定义 segue 将其链接到我的初始视图控制器,然后在 ViewController 的 viewDidLoad 方法中调用 segue。登录Segue.h

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

登录Segue.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

然后在情节提要中,选择您的 segue 并将 segue 类设置为 LoginSegue 并将标识符设置为您喜欢的任何内容。我的是@“toLogin”。并在您的 viewDidLoad 中包含以下内容:

[self performSegueWithIdentifier:@"toLogin" sender:self];
于 2012-04-24T23:33:31.743 回答
0

presentModalViewControllerUIViewController类的一个方法。您的 AppDelegate 是一个 NSObject 或 UIResponder 所以不会识别它。

您应该以非模态方式显示您的密码/密码视图,将其放在 Storyboard 的第一个 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];
}

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

于 2012-04-24T23:35:26.827 回答