我正在尝试在启动应用程序时显示密码/密码(模态视图控制器)。您可以在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(模态)。现在它的工作非常顺利。
答案 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)
presentModalViewController
是UIViewController类的方法。您的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),或者只是启动应用程序(解散)。
希望这有帮助。