6

在 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];
4

2 回答 2

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];
}

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

于 2010-08-08T17:13:51.733 回答
1

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

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

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

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