将 applicationwillenterforeground 用于密码屏幕
Posted
技术标签:
【中文标题】将 applicationwillenterforeground 用于密码屏幕【英文标题】:Using applicationwillenterforeground for a passcode screen 【发布时间】:2010-08-08 13:29:23 【问题描述】:在 ios4 之前,我的应用程序的初始视图控制器会检查 viewWillAppear 中的密码开/关设置变量,如果设置为打开,则会显示一个模式密码屏幕,该屏幕将一直停留在那里,直到输入正确的密码或按下 Home 按钮。
在 iOS4 中,如果我的应用程序一直在后台运行,我希望用户能够放心,如果他们将手机交给他人使用,应用程序中包含的数据将无法轻松访问。
由于应用程序可以返回到任何屏幕(应用程序最后打开的屏幕),我想我会使用 UIApplicationWillEnterForegroundNotification 和本地选择器(重复的 enterPasscode 方法),每个都有正确的视图控制器来推送基于本地屏幕,但必须有更好的方法。
我在这里可能有一点概念上的误解。有人可以建议另一种方法或推动我进入下一步。我可以将此作为共享方法但仍知道要推送的正确本地视图控制器吗?
谢谢
编辑/更新:
短版:它有效,但可能还有更好的方法(感谢任何帮助)...
我创建了一个带有视图控制器的标准单例。
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];
【问题讨论】:
【参考方案1】:您可以通过实现将这种行为集中在您的应用委托中
-(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];
我希望能更直接地解决您的问题。
【讨论】:
这是我开始的地方,但不知道应该为视图控制器添加什么 - 我会考虑一下然后尝试一下。 我从概念上理解你想要做什么——在这里而不是在每个视图控制器上显示一个密码屏幕——看起来它应该可以工作,但事实并非如此。完全按照原样复制代码(将 PasscodeInputController 更改为 EnterPasscode),构建良好,没有错误,没有警告,但什么也没有出现。我最初并不熟悉 UIWindow 的 rootViewController 属性,但在阅读了它是什么之后,它看起来应该可以工作 - 尽管找不到任何其他示例。我尝试了其他几件事 - 尝试在那里使用导航控制器,尝试了子视图,makeKeyAndVisible 但没有。 你得到一个非零值,但是? 您的应用导航控制器是否基于?您是否将导航控制器作为属性存储在您的应用程序委托中?尝试使用 currentController = [[self navController] visibleViewController] 获取当前视图(在 [yourAppDelegate applicationWillEnterForeground] 中),然后在其上调用 presentModalViewController。 @Seamus 参见上面的编辑/更新。感谢您让我朝着正确的方向前进。您的问题:不,在我作为“解决方案”所做的之前, currentController 一直为零。可能应该提供有关应用程序结构的更多详细信息。该应用程序有一个选项卡栏控制器,5 个选项卡中的每一个都有自己的导航控制器、许多 pushViewController 和 presentModelViewController 以及许多不同的进入后台的位置。没有将导航控制器存储为应用程序委托的属性。我尝试了一种变化,但没有帮助。感谢您的额外帮助,以使您的方法有效。【参考方案2】:您的应用程序在重新进入前台时的行为应尽可能与首次启动时的行为相似。考虑到这一点,您可以将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];
根据您应用的细节,它可能需要初步工作,但它有一些好处:
它将确保启动和重新启动相似,因此用户体验不是“随机的”。 您可以在后台更轻松地释放许多不需要的内存。 从一个中心位置管理应用程序的状态更容易。【讨论】:
以上是关于将 applicationwillenterforeground 用于密码屏幕的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等