在app简历上显示登录视图

时间:2012-01-25 20:58:24

标签: objective-c ios

在应用简历上显示视图(在我的情况下是登录屏幕)的最佳方式是什么。从环顾四周来看,我一直在AppDelegate中玩applicationDidBecomeActive事件,但我似乎无法理解如何从这里正确显示视图。

我尝试使用self.window和/或它的子视图来抓取当前窗口,但是来自AppDelegate self.window的是nil。

到目前为止,这个应用程序似乎已正确连接,但我对两件事情感到困惑。

A)为什么self.window nil来自AppDelegate的applicationDidBecomeActive事件处理程序。

B)在应用程序恢复时显示登录视图(或类似文件)的正确/正常方式是什么。

3 个答案:

答案 0 :(得分:4)

为您的所有应用程序实现自定义UIViewController。在此视图中,控制器在viewWillAppear消息中实现逻辑,以确定并在必要时显示登录屏幕。

//CustomViewController.h
@interface CustomViewController : UIViewController
@end

//CustomerViewController.m
@implementation CustomViewController
-(void)viewWillAppear:(BOOL)animated{
    if(login_required){
         LoginViewController *loginView = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil];
         [self presentModalViewController:loginView animated:false];
    }
}
@end

然后,简单地说,在您的登录视图控制器中确保您致电:

[self dismissModalViewControllerAnimated:false];

这种方法的好处有两个方面。首先,这是一个非常简单的实现。但是,最引人注目的是,为应用程序的视图控制器提供基类提供了提取通用逻辑的机会。

答案 1 :(得分:2)

杰森,

我参与了由Chris Lowe在raywenderlich.com上提供的安全教程,该教程旨在演示如何使用基本的iOS安全性来锁定应用程序。

本教程背后的前提是,应用程序会在首次启动时提示登录,如果在通过在viewDidLoad中使用NSNoftificationCenter解锁设备时恢复应用程序并订阅通知:deviceWillLock和deviceWillUnlock。 所有这一切都假设设备已设置为锁定。

Basic iOS Security Tutorial Part 2 - 这是具有NSNotification注册的部分。

Basic iOS Security Tutorial Part 1 - 为清晰起见,这是本教程的第一部分。

答案 2 :(得分:1)

我也遇到了这个问题,并在研究解决方案时遇到了这个问题。我不想为我的视图创建中级超类,我不确定它如何与导航控制器一起工作。我想出了另一个适合我的解决方案 - 我想我会分享它。它基于NSNotificationCenter

的使用

在你的app delegate中创建一个属性来保存对当前显示的视图控制器的引用 - 比如currentViewController

然后在applicationDidFinishLaunching方法中,注册一个块观察器来更新currentViewController属性,如下所示:

[[NSNotificationCenter defaultCenter] addObserverForName:@"CurrentViewChanged"
                                                  object:nil 
                                                   queue:nil
                                              usingBlock:^(NSNotification *note)
 {self.currentViewController = (UIViewController *)note.object;} ];

在视图控制器实现中,更新viewDidAppear方法,通过添加以下行来通知观察者正在显示新的视图控制器

[[NSNotificationCenter defaultCenter] postNotificationName:@"CurrentViewChanged" object:self];

最后,在app delegate中的applicationDidBecomeActive方法中包含代码,以强制显示登录屏幕的模式。

UIStoryboard *mainStoryBoard = self.window.rootViewController.storyboard;
UnlockViewController *uvc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"modalUnlockView"];
uvc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self.currentViewController presentViewController:uvc animated:YES completion:NULL];

需要注意的其他几项: -

  1. 您可以随时通过发布视图控制器传递的通知nil来禁用登录屏幕显示。
  2. 您只需要在顶层为导航视图控制器发布一次通知。将涵盖导航控制器堆栈中的所有视图控制器。我没有检查过,但我怀疑标签视图控制器也是如此。
  3. 如果要在启动后第一次进入应用程序时显示登录屏幕,请在applicationDidFinishLaunching方法中包含以下行。

    self.currentViewController = self.window.rootViewController;

  4. 我希望这有一些用处。

    谢谢