Xcode:在applicationDidBecomeActive中显示login视图
在我的应用程序中,我想显示一个login屏幕 – 当应用程序启动时以及应用程序变为活动状态时显示。 作为参考,我正在使用故事板,ARC,它是一个选项卡式的酒吧应用程序。
因此我需要在applicationDidBecomeActive
方法中执行这个过程:
- (void)applicationDidBecomeActive:(UIApplication *)application { if ( ... ) { // if the user needs to login PasswordViewController *passwordView = [[PasswordViewController alloc] init]; UIViewController *myView = self.window.rootViewController; [myView presentModalViewController:passwordView animated:NO]; } }
在某种程度上这确实奏效 – 我可以在viewDidAppear
调用一个方法,该方法显示一个警告视图,以允许用户login。但是,这是不可取的,我想要一个login文本框和其他UI元素。 如果我不打电话给我的login方法,即使我已经在视图上放置了一个标签和其他元素,屏幕仍然是黑屏。
有谁知道解决这个问题的方法吗? 我的密码视图embedded在导航控制器中,但与主要故事板分离。
各种各样的答案最终使我得到了一个似乎不太复杂的答案,所以我将把它发布在这里 – 如果我是诚实的,它实际上看起来非常好。
首先,我的密码视图embedded在导航控制器(编辑器 – >embedded),这是连接到主标签栏控制器使用模式segue与id,在我的情况下'loginModal'。
在applicationDidBecomeActive
方法中就像这样:
[self performSelector:@selector(requestPasscode) withObject:nil afterDelay:0.2f];
然后把这个函数放在App Delegate的某个地方
-(void)requestPasscode{ if ( /* If the user needs to login */ ) { [self.window.rootViewController performSegueWithIdentifier:@"loginModal" sender:self]; } }
这将显示您的login视图,每当应用程序开始或进入前台(例如,切换应用程序时)。
注:如果您的应用程序的根目录embedded到导航控制器中,上述行将不起作用。
但是有两个错误;
- 如果用户以前在查看应用程序时正在查看模式视图
- 如果用户在密码视图中解除了应用程序。
这两个都会导致应用程序崩溃,所以在applicationWillResignActive
方法中会出现以下代码行。
[self.window.rootViewController dismissViewControllerAnimated:NO completion:nil];
它基本上消除了所有呈现的模态观点。 这可能并不理想,但是模态视图往往不是用于数据input,因此在很多情况下,这是一个理想的效果。
您应该从xib启动PasswordViewController
viewcontroller,或者如果您将UI存储在Storyboard中,则应该使用Segue来呈现此控制器。
我不能说另一个部分,但是这部分在我看来很奇怪。
我的密码视图embedded在导航控制器中,但与主要故事板分离。
在故事板中,您可以存储视图控制器并查看视图控制器的内部,因此在viewcontroller之外存储一些视图并不好,因为在接收到内存警告后,您将无法从故事板加载此视图。 请纠正我,如果我没有得到你的意思。
如果我们按照自己的方式进行操作,那么在applicationDidBecomeActive
或在Storyboard上的第一个视图控制器上加载PasswordViewController
没有区别,因为您从第一个加载的视图控制器调用当前视图控制器。 所以你可以在你的第一个视图控制器。 你也可以在你的第一个视图控制器中存储一些隐藏的视图,并显示这个视图,如果用户需要login。
我testing了它。 所以起初你的控制器被加载,然后你有方法applicationDidBecomeActive
。 所以最好把你的代码放在里面-(void)viewDidAppear:animated
你的第一个viewcontroller的-(void)viewDidAppear:animated
方法。
最好的问候,丹尼尔