6

在我的应用程序中,我想显示一个登录屏幕 - 将在应用程序启动和应用程序激活时显示。作为参考,我使用的是故事板、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该方法中显示警报视图以允许用户登录。但是,这是不可取的,我希望有一个登录文本框和其他 ui 元素。如果我不调用我的登录方法,则不会发生任何事情并且屏幕保持黑色,即使我在视图上放置了标签和其他元素。

有谁知道解决这个问题的方法?我的密码视图嵌入在导航控制器中,但与主故事板分离。

4

2 回答 2

7

各种各样的答案最终让我找到了一个看起来不太复杂的答案,所以我会在这里发布 - 如果我说实话,它实际上看起来真的很好。

首先,我的密码视图嵌入在导航控制器(编辑器-> 嵌入)中,并使用带有 id 的模态 segue 连接到主选项卡栏控制器,在我的情况下为“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];
    }
}

每当应用程序开始或进入前台时(例如,切换应用程序时),这将显示您的登录视图。

注意: 如果您的应用程序的根目录嵌入在导航控制器中,则上述行将不起作用。

但是有两个错误;

  1. 如果用户在关闭应用程序时之前正在查看模态视图
  2. 如果用户在密码视图中关闭了应用程序。

这两种情况都会导致应用程序崩溃,因此方法中包含以下行applicationWillResignActive

[self.window.rootViewController dismissViewControllerAnimated:NO completion:nil];

It basically dismisses all modal views that are presented. This may not be ideal, but modal views are more often then not, used for data entry and so in many cases, this is a desired effect.

于 2012-11-26T11:01:27.267 回答
-1

您应该 PasswordViewController从 xib 初始化 viewcontroller,或者如果您将 UI 存储在 Storyboard 中,您应该使用 Segue 来呈现这个控制器。

我不能说其他部分,但那部分在我看来很奇怪。

我的密码视图嵌入在导航控制器中,但与主故事板分离。

在情节提要中,您可以在视图控制器中存储视图控制器和视图,因此在视图控制器之外存储一些视图并不好,因为在收到内存警告后您将无法从情节提要中加载此视图。如果我没有明白你的意思,请纠正我。

PasswordViewController如果我们按照您的方式进行,那么在 Storyboards 的第一个视图控制器上或在您的第一个视图控制器上加载没有区别applicationDidBecomeActive,因为您从第一个加载的视图控制器调用当前视图控制器。所以你可以在你的第一个视图控制器中做到这一点。您还可以在您的第一个视图控制器中存储一些隐藏视图,并在用户需要登录时显示此视图。

我测试了它。所以首先你的控制器被加载,然后你得到了方法applicationDidBecomeActive。所以最好把你的代码放在-(void)viewDidAppear:animated你的第一个视图控制器的方法中。

最好的问候,丹尼尔

于 2012-11-22T16:22:54.697 回答