Iphone iOS:崩溃后是否可以打开以前的viewController并重新启动应用程序?
如何做到这一点呢?请给我一些指导。我在下面描述我的问题 当我点击主页按钮并从托盘中移除应用程序时,当我打开应用程序时,我会看到登录屏幕。我知道如何很好地使用Iphone iOS:崩溃后是否可以打开以前的viewController并重新启动应用程序?,iphone,ios,objective-c,Iphone,Ios,Objective C,如何做到这一点呢?请给我一些指导。我在下面描述我的问题 当我点击主页按钮并从托盘中移除应用程序时,当我打开应用程序时,我会看到登录屏幕。我知道如何很好地使用NSUserDefaults 但我的问题是,当我导航到第三或第四个viewController时,我按下Home按钮并从托盘中移除应用程序,然后每当我打开应用程序时,我都不想用上次打开的viewController打开 同样,当我的应用程序崩溃时,我再次打开它,然后我想用上次打开的viewController状态打开应用程序 所以我只想知道这
NSUserDefaults
但我的问题是,当我导航到第三或第四个viewController
时,我按下Home按钮并从托盘中移除应用程序,然后每当我打开应用程序时,我都不想用上次打开的viewController
打开
同样,当我的应用程序崩溃时,我再次打开它,然后我想用上次打开的viewController
状态打开应用程序
所以我只想知道这有没有可能?如果是,那么请指导我如何实现这一目标
谢谢我知道您对代码部分没有意见,所以我将给出我的建议 在每个视图控制器的
viewdiload
上,设置导航阵列上最顶端对象的nsuserdefault值
如果它们的分支不太多,那么您可以轻松地管理根视图控制器的推送是,这两种情况都是可能的 在崩溃时,您可以使用UncaughtExceptionHandler执行一些代码。在应用程序委托中,按如下方式注册处理程序:
- (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];
}
当应用程序运行时,要跟踪上次选择的选项卡栏控制器,请使用UITABBARCONTROLLERDEGATE
,并将新选择的选项卡栏索引保存到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
}
每当tabbar的选定索引发生更改时,此代码将上次选定的tabbar索引保存到NSUserDefaults
最后,当应用程序启动时(在您的didfishlaunchingwithoptions
),从NSUserDefaults
中读取上次保存的tabbar索引,并相应地设置tabbar的选定索引
self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults;
编辑:
如果您还需要恢复UINavigationController
s控制器堆栈,这是一项相当困难的任务。我给你一个快速的概述,我想到了什么
有两种情况:
- 您有自定义视图控制器初始值设定项,需要将自定义对象传递给这些控制器-在这种情况下,几乎不可能(在合理的时间内)实现这一点
- 仅使用
或-init
:初始化导航堆栈中的视图控制器。您可以从选项卡的根-initWithNibName…
枚举控制器,使用UINavigationController
获取它们的类名,并将它们保存到NSStringFromClass
。在应用程序启动时,您将反转该过程(使用从NSUserDefaults
读取的名称字符串初始化控制器,使用类似以下内容:NSUserDefaults
)UIViewController*vc=[[NSClassFromString(@“aa”)alloc]init];
- 这不是正确的答案,但您可以在启动后将其用于导航视图
在AppDelegate文件中,使用以下代码:---
在登录viewController的init方法中添加通知观察员,在通知方法中,如果收到viewController名称的条件,则可以应用。并在启动LoginView控制器时推送到该viewController,如下所示:---
这可能会帮助您……但是当我在navigate Tabbarviewcontroller-->另一个ViewController中时会怎么样呢?thx提供信息,但是您的想法很好,但是我担心如何使用navigaiton+tabbar和两种登录管理和使用方式来管理我的所有应用程序。。?那么如何管理此plus LoginScreen…及其相关会话和用户…?抱歉,我无法再为您提供更多详细帮助:-/可能的解决方案很大程度上取决于您的应用程序体系结构,我希望你们能理解:-)是的,我知道这就是为什么我这么问:)无论如何谢谢你们的努力和帮助…这个答案看起来很合理。看看什么是应用程序-他们有这两个标签栏和导航。选项卡栏:可能的5个vcs将保存显示的最后一个vcs。导航:如果你在向一个联系人写文本的过程中退出应用程序,你将被重启到相同的位置(这是在一个导航控制器里面)。感谢你的回复是好的,但是我担心如何用WaveAdInt+Tabar来管理这个我的所有应用程序,还有两种类型的登录管理和使用……那么如何管理这个plus LoginScreen…及其相关会话和用户呢?Woohh我认为您必须创建一个类(序列化),然后在其中保存所有必要的信息,如帐户类型、选项卡索引、viewcontroller。以用户默认值将其另存为nsdata
#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.
}
- (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];
}
}