2013-08-06 73 views
1

我在添加uinavigationcontroller AppDelegate.m這樣不使用故事板的應用程序狀態保存和恢復?

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不會被調用。

我不知道我在做什麼錯?

+0

現在我通過添加self.restorationIdentifier = @「secondViewController」來獲取輸出窗口中的所有日誌; self.restorationClass = [self class];但導航控制器總是顯示第一個視圖...請任何幫助。 –

+0

我有同樣的問題,我有故事板中的所有控制器,你有任何解決方法..請幫助 看到這個問題我已經發布 http://stackoverflow.com/questions/25197980/issue-with-state -preservation和 - 恢復功能於IOS?noredirect = 1#comment39241814_25197980 – Sabby

回答

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

} 
0

無論- (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder也不- (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder實現增加這方面的工作。