如何实现以下这些内容?请给我一些指导。我在下面描述我的问题。
当我点击主页按钮并从托盘中删除应用程序时,当我打开应用程序时,我会看到登录屏幕。我知道如何使用NSUserDefaults
。
但我的问题是,当我导航第3或第4 viewController
时,我按下主页按钮并从托盘中删除应用程序,然后每当我打开应用程序时,我想打开最后一次打开viewController
。< / p>
同样,当我的应用程序崩溃并且我再次打开它时,我想打开上次打开viewController
状态的应用程序。
所以我只是想知道那可能与否?如果是,那么请指导我如何实现这些目标。
谢谢
答案 0 :(得分:3)
是,两种情况都是可能的。
崩溃,您可以使用UncaughtExceptionHandler来执行某些代码。在你的app delegate中,注册你这样的处理程序:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
// Other didFinishLaunchingWithOptions code
并将处理程序方法添加到相同的.m文件
void uncaughtExceptionHandler(NSException *exception)
{
// App crashed, save last selected tabbar index to the to the NSUserDefaults
[[NSUserDefaults standardUserDefaults] setInteger:tabBarController.selectedIndex forKey:@"LastSelectedTabbarIndex"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
在应用运行时,要跟踪上次选择的标签栏控制器,请使用UITabBarControllerDelegate
并将新选择的标签栏索引保存到NSUserDefaults
。简短的例子:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
NSUInteger tabIndex = [[tabBarController viewControllers] indexOfObject:viewController];
// I have newly selected index, now save it to the NSUserDefaults
}
每次标签栏选定的索引更改时,此代码会将上次选中的标签栏索引保存到NSUserDefaults
。
最后,当您的应用开始时(在didFinishLaunchingWithOptions
中),请从NSUserDefaults
读取上次保存的标签栏索引并相应地设置标签栏的所选索引
self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults;
修改强>
如果你还需要恢复UINavigationController
的控制器堆栈,那么它的任务非常困难。我简要介绍一下我的想法。
有两种情况:
-init
或-initWithNibName...
:初始化导航堆栈中的视图控制器。您可以从选项卡的根UINavigationController
枚举控制器,使用NSStringFromClass
获取其类名并将其保存到NSUserDefaults
。在应用程序启动时,您将反转过程(使用从NSUserDefaults
读取的名称字符串初始化控制器,使用类似这样的内容:UIViewController *vc = [[NSClassFromString(@"aa") alloc] init];
)。答案 1 :(得分:2)
我知道您对代码部分没问题,所以我只是提出我的建议
在每个视图控制器的viewDidLoad
上设置导航阵列上最顶层对象的nsuserdefault值。
如果它们的分支不是太多,那么您可以轻松管理根视图控制器的推送
答案 2 :(得分:2)
这不是正确的答案,但您可以在启动后使用它来导航视图。
在AppDelegate文件中使用以下代码:---
#import "NewSAppDelegate.h"
#import "NewSViewController.h"
static NewSAppDelegate *globalSelf;
@implementation NewSAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[NewSViewController alloc] initWithNibName:@"NewSViewController" bundle:nil];
self.navController=[[UINavigationController alloc] initWithRootViewController:self.viewController];
self.window.rootViewController = self.navController;
[self.window makeKeyAndVisible];
globalSelf=self;
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
return YES;
}
void uncaughtExceptionHandler(NSException *exception)
{
UIViewController *currentVC = globalSelf.navController.visibleViewController;
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
UIViewController *currentVC = self.navController.visibleViewController;
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil];
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
在你的登录viewController的init方法中添加一个观察者来通知,并且在通知方法中,你可以在收到viewController名字的条件时申请。并在启动LoginView控制器时推送到那个viewController:---
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(openLastVC)
name:@"appDidBecomeActive"
object:nil];
// Custom initialization
}
return self;
}
-(void)openLastVC
{
NSLog(@"val ==%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"]);
if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"] isEqualToString:@"GhachakViewController"]) {
GhachakViewController *gvc=[[GhachakViewController alloc] initWithNibName:@"GhachakViewController" bundle:nil];
[self.navigationController pushViewController:gvc animated:NO];
}
}
这可以帮助你......