使用applicationwillenterforeground作为密码屏幕

时间:2010-08-08 13:29:24

标签: iphone ios4 uiapplicationdelegate

在iOS4之前,我的应用程序的初始视图控制器将检查viewWillAppear中的密码开/关设置变量,如果设置为on,则会显示一个模态密码屏幕,该屏幕将一直保留,直到输入正确的密码或按下Home按钮。 / p>

使用iOS4,如果我的应用程序已经在后台,我希望用户感到很舒服,如果他们要将手机交给某人使用,则应用程序中包含的数据不易被访问。

由于应用程序可以返回任何屏幕(应用程序最后一次打开的屏幕),我想我会使用本地选择器(重复的enterPasscode方法)到处都使用UIApplicationWillEnterForegroundNotification,每个都有正确的视图控制器来推送基于本地屏幕,但必须有更好的方法。

我可能在这里有轻微的概念误解。有人可以提出另一种方法,或者推动我继续下一步。我可以将此作为共享方法,但仍然知道要推送正确的本地视图控制器吗?

由于

EDIT / UPDATE:

简短版本:它有效,但可能仍有更好的方法(任何帮助赞赏)......

我使用视图控制器创建了标准单例。

PasscodeView.h包含:

UIViewController *viewController;
@property (nonatomic, retain) UIViewController *viewController;

PasscodeView.m包含:

@synthesize viewController;

我把它放在AppDelegate中:

-(void)applicationWillEnterForeground:(UIApplication*)application {

    PasscodeView *passcodeView = [PasscodeView sharedDataManager];
    UIViewController *currentController =  [passcodeView viewController];
    NSLog(@"%@", currentController);  //testing
    EnterPasscode *passcodeInput = [[EnterPasscode alloc] initWithNibName:@"Passcode" bundle:nil];
    [currentController presentModalViewController:passcodeInput animated:NO];
    [passcodeInput release];
}

以及我的所有viewDidLoad中的以下内容,当我进入每个屏幕时更新当前视图控制器(只有2行,但似乎还有更好的方法):

PasscodeView *passcodeView = [PasscodeView sharedSingleton];
passcodeView.viewController = [[self navigationController] visibleViewController];

我希望有一种方法可以从applicationWillEnterForeground获取当前的视图控制器,但我找不到它 - 这里的任何帮助仍然很感激。

为了保持一致性,我更改了一行并添加了一行以获取导航栏以匹配应用的其余部分并包含标题。

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeInput];
[currentController presentModalViewController: passcodeNavigationController animated:NO];

2 个答案:

答案 0 :(得分:3)

您可以通过实施

将此行为集中在您的应用委托中
-(void)applicationWillEnterForeground:(UIApplication*)application;

您可以实现存储当前适当的模态视图控制器的单例,并在每个视图控制器的viewWillAppear中更新它。

编辑:我假设您已经拥有了一系列想要显示的视图控制器。我怀疑你真的需要它。如果您有一个名为PasscodeInputController的调用,那么您的applicationWillEnterForeground将如下所示:

-(void)applicationWillEnterForeground:(UIApplication*)application {
    UIViewController *currentController =  [window rootViewController];
    PasscodeInputController *passcodeInput = [[PasscodeInputController alloc] init];

    [currentController presentModalViewController:passcodeInput animated:NO];
    [passcodeInput release];
}

我希望能更直接地解决您的问题。

答案 1 :(得分:1)

重新进入前景时,应用程序的行为应尽可能与第一次启动时的行为相似。考虑到这一点,您可以将applicationDidFinishLaunching:applicationWillEnterForeground:合并,但考虑到某些视图可能已加载。代码是这样的:

id myState = (isReentering) ? [self validateState] : [self loadStateFromSave];
NSArray * keyForObjectToLoad = [self objectsToLoadForState:myState];
for(NSString * key in keyForObjectToLoad)
    if(![self objectForKey:key]) [self loadObjectForKey:key];

根据您应用的详细信息,它可能需要初步工作,但它有一些好处:

  • 它将确保启动和重新启动类似,因此用户体验不是“随机”。
  • 您可以在后台更轻松地释放许多不需要的内存。
  • 从中心位置管理应用程序的状态会更容易。