当在详细屏幕中的我的 iOS 应用程序中时,我按下主页按钮,这将导致它进入后台模式。在 7 分钟左右不活动后,我重新启动它,但它并没有从我离开它的地方开始。它从第一个屏幕开始。
我上网,开始了解国家保护和恢复。我在一个屏幕上实现了,但它似乎不起作用。这就是我在 appDelegate.m 中所做的
//appDelegate.m
-(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
return YES;
}
-(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
return YES;
}
以下代码在 appDelegate.m 中的 willFinishLaunchingWithOptions 方法中。我没有使用故事板,因为这个应用程序很旧。它有XIB。所以这个应用程序总是需要进入登录屏幕,检查是否存储了 accessToken,它将从登录屏幕进入主屏幕。如果未存储,它将保留在登录屏幕中。所以这是强制执行的。因此,只有一种方法可以像下面这样编码。
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
...
loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
self.navigationController = [[UINavigationController alloc]initWithRootViewController:loginViewController];
self.navigationController.restorationIdentifier = @"NavigationController";
[loginViewController.view setBackgroundColor:[UIColor whiteColor]];
self.window.rootViewController = self.navigationController;
...
...
}
我已经在 viewDidLoad() 中为所有视图控制器提供了 restoreId,如下所示。例如,这就是我在 PetDetailViewController.m 中所做的
- (void)viewDidLoad
{
[super viewDidLoad];
self.restorationIdentifier = @"MatchedPetIdentification";
self.restorationClass = [self class];
}
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
[super encodeRestorableStateWithCoder:coder];
}
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
[super decodeRestorableStateWithCoder:coder];
}
现在,当我进入 PetDetail 屏幕并按下主页按钮时,将调用 encodeRestorableStateWithCoder()。从 xcode 停止应用程序,重新启动它会停留在同一屏幕上,但会立即进入登录屏幕并转移到主屏幕(willFinishLaunchingWithOptions 中的代码可能正在执行)
我做错什么了吗?除非用户手动杀死它,否则如何防止应用程序从第一个屏幕重新启动?