应用程序状态保存和恢复而不使用故事板?

时间:2013-08-06 12:43:10

标签: ios ios6 uikit-state-preservation

我在 AppDelegate.m 中添加了uinavigationcontroller

 self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:self.viewController];
nav.restorationIdentifier = @"nav1";
self.window.rootViewController = nav;

我的 ViewController.m 看起来像这样

- (void)viewDidLoad
{
      [super viewDidLoad];
       self.restorationIdentifier = @"secondViewController";
    // Do any additional setup after loading the view, typically from a nib.
}

-(IBAction)click:(id)sender {

     secondViewController *svc = [[secondViewController  alloc]initWithNibName:@"secondViewController" bundle:nil];
      svc.restorationIdentifier = @"secondViewController";

      svc.restorationClass = [self class];
     [self.navigationController pushViewController:svc animated:YES];
}

我的 secondViewController.m 喜欢

+(UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
{
    NSLog(@"viewControllerWithRestorationIdentifierPath");
    UIViewController * myViewController =
    [[secondViewController alloc]
     initWithNibName:@"secondViewController"
     bundle:nil];

    return myViewController;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization

    }
    return self;
}


- (void)viewDidLoad
{
    [super viewDidLoad];

    label.text = @"sdfkheiowodhnskjfdgewluri3y2oejdscndjshfiledhdsfhewilufhyeows";

    // Do any additional setup after loading the view from its nib.
}

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
    NSLog(@"encodeRestorableStateWithCoder");

    [coder encodeObject:label.text forKey:@"UnsavedText"];

    [super encodeRestorableStateWithCoder:coder];
}

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
    NSLog(@"decodeRestorableStateWithCoder");

    [super decodeRestorableStateWithCoder:coder];

    label.text = [coder decodeObjectForKey:@"UnsavedText"];
}

输出

我得到encodeRestorableStateWithCoder但在此之后我按下home按钮然后再次运行应用程序我的应用程序状态不存在secondViewController和decodeRestorableStateWithCoder没有被调用。

我不知道我在哪里做错了?

2 个答案:

答案 0 :(得分:3)

我通过在appdelegate.m中添加它来实现它。

NSString * const kRootViewControllerKey = @"RootViewKey";

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self commonInitWithOptions:launchOptions];
    return YES;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self commonInitWithOptions:launchOptions];
    return YES;
}

- (void)commonInitWithOptions:(NSDictionary *)launchOptions {

    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^ {

        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

        UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:self.viewController];
        nav.restorationIdentifier = @"NavigationController";
        self.window.rootViewController = nav;
        [self.window makeKeyAndVisible];
    });
}

// Encode app delegate level state restoration data
- (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.window.rootViewController forKey:kRootViewControllerKey];
}

// Decode app delegate level state restoration data
- (void)application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder {

    // Find the preserved root view controller and restore with it
    UINavigationController *navControlller = [coder decodeObjectForKey:kRootViewControllerKey];

    if (navControlller) {
        self.window.rootViewController = navControlller;
    }

}

答案 1 :(得分:0)

- (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder- (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder都未实施。