NSUserDefaults不保存导航

时间:2014-05-28 14:59:44

标签: ios objective-c ipad uitableview nsuserdefaults

我正在使用故事板在Xcode 5中开发适用于iPad的应用程序(IOS7)。我有一个奇怪的问题:

我从按下按钮调用此方法:

-(void)navigateToProjectsPage {
// Save the currently open subject
NSString *detailDescription;
NSString *imageDescription;

// Get the information to be saved
detailDescription = _detailDescriptionTextView.text;
imageDescription = _imageDescriptionTextView.text;

// Create the 2 save keys
NSString *detailDescriptionKey = [NSString stringWithFormat:@"%@%@", [self.detailItem description], @"-detailDescription"];
NSString *imageDescriptionKey = [NSString stringWithFormat:@"%@%@", [self.detailItem description], @"-imageDescription"];

NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
[myDefaults setObject:detailDescription forKey:detailDescriptionKey];
[myDefaults setObject:imageDescription forKey:imageDescriptionKey];
[myDefaults synchronize];

// Close this project
[self performSegueWithIdentifier:@"projectsSegue" sender:nil];

// Show the selectSubjectBanner
_selectSubjectBanner.hidden = NO;
}

应该保存一些新输入的数据,然后将模态转换为新的视图控制器。每当我解雇新的VC并回到这个并试图加载保存的项目时,它就什么也没回来 - 就像它没有被保存一样。但是,如果我只是在多任务处理中关闭我的应用程序,而不按下按钮 - 它会使用AppDelegate.m方法保存:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

// Save what the user entered
NSString *detailDescription;
NSString *imageDescription;

// Get the information to be saved
detailDescription = _detailViewController.detailDescriptionTextView.text;
imageDescription = _detailViewController.imageDescriptionTextView.text;

// Create the 2 save keys
NSString *detailDescriptionKey = [NSString stringWithFormat:@"%@%@", ([self.detailViewController.detailItem description]), @"-detailDescription"];
NSString *imageDescriptionKey = [NSString stringWithFormat:@"%@%@", [self.detailViewController.detailItem description], @"-imageDescription"];

// Save the data
[[NSUserDefaults standardUserDefaults] setObject:detailDescription forKey:detailDescriptionKey];
[[NSUserDefaults standardUserDefaults] setObject:imageDescription forKey:imageDescriptionKey];
}

有什么线索?

谢谢!

3 个答案:

答案 0 :(得分:1)

[self.detailItem description]不太可能做你想做的事。它可能包含self.detailItem的实例指针,当详细信息项更改时(甚至当您使用相同的详细信息项重新加载时)将更改,因此您的密钥将不匹配。如果有关细节项目的任何其他变化,那也可能会产生影响。

用户默认值中的键通常应该具有可以再次找到的漂亮静态键。

要查看到目前为止您添加的内容,请记录[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]并搜索您的-detailDescription代码。

此外,在您的情况下,使用这个短期样式存储的用户默认值(无论如何它看起来像)可能不是最好的。通过在字典中创建和存储(并在需要时作为属性传递)此数据,您可以成为更好的服务器。

答案 1 :(得分:0)

Wain的回答是正确的。 detailItem的描述看起来像<UIClassName: 0x2ad7b00>。此外,您在询问导航时未保存数据的原因。这是因为隐藏了详细视图控制器时会释放 detailItem 。再次显示控制器时,将再次分配 detailItem ,因此它将具有不同的地址。因此,描述将不同。

但是,当您的应用程序进入后台详细信息时,控制器将保留在内存中,并且 detailItem 的地址不会更改。

答案 2 :(得分:0)

探测是在输入一个新的UIViewController之后,当它应该被清除时,旧信息仍留在系统中 - 编写了修复它的代码:

-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
        // Clear as we're about to open a new project/exit
    _detailViewController.detailItem = @"";
    selectedSubject = @"";

}

您可能需要像我一样创建BOOL(不在此代码段中),以便在使用MasterDetail模板时不会干扰其他功能