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到导航控制器中,上述行将不起作用。

但是有两个错误;

  1. 如果用户以前在查看应用程序时正在查看模式视图
  2. 如果用户在密码视图中解除了应用程序。

这两个都会导致应用程序崩溃,所以在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方法。

最好的问候,丹尼尔