当我从家乡的segue转到另一个时,我将数据输入到文本字段中。我在顶部有一个导航栏,如果我点击后退按钮进入主页segue,我会丢失我输入的所有数据。将数据保存在这些字段中的有效方法是什么?
谢谢。
编辑: 也许这会有所帮助,但是当我加载屏幕时,它会调用方法 -
- (void)viewDidLoad {
NSLog(@"Testing viewDidLoad");
[super viewDidLoad];
// Do any additional setup after loading the view.
_YourName.delegate = self;
_Notes.delegate = self;
// Set up the scroll view.
_scroller.delegate = self;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];}
但当我回到上一个viewcontroller或点击ipad上的主页按钮时,它不会调用:
- (void)viewDidUnload{
NSLog(@"Testing viewDidUnload");
[self setYourName:nil];
[self setPartnersName:nil];
[self setStartTime:nil];
[self setEndTime:nil];
[self setCurrentTemp:nil];
[self setCurrentWeather:nil];
[self setProjectName:nil];
[self setInstructorName:nil];
[self setClassNum:nil];
[self setWaypoints:nil];
[self setNotes:nil];
[super viewDidUnload];}
如果我点击主页按钮然后重新打开应用程序,数据仍保留在UITextFields和UITextViews中。如果我转回到之前的UIViewController,它就会消失。
- (IBAction)saveCurrent:(id)sender {
if([self checkFields]){
[self getEndingTime]; //gets the time when saved
// save all data to string using csv formatting
NSString *resultLine = [self getCSVformat];
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
// get today's date for file name ****DO DATE FORMATTER ONLY ONCE
NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSString *todayDate = [dateFormatter stringFromDate:today];
//make a file name to write the data to using the documents directory:
NSString *fileName = [NSString stringWithFormat:@"%@/%@_%@_%@.csv",documentsDirectory,
todayDate,[[self ProjectName] text],[[self YourName] text]];
//save content to the documents directory
[resultLine writeToFile:fileName
atomically:NO
encoding:NSUTF8StringEncoding
error:nil];
}}
- (IBAction)retractKeyboard:(id)sender {
[self resignFirstResponder];}
答案 0 :(得分:1)
当您按下第二个视图控制器时,会创建第二个视图控制器的新实例,这就是显示的内容。当您按下后退按钮时,此实例将被销毁,并且原始视图控制器会弹回。当您再次访问第二个视图控制器时,它是另一个新实例,因此所有字段都是空的。
如果按主页按钮,您的应用程序将暂停,但第二个视图控制器实例仍在内存中,因此如果您立即返回应用程序,则值仍然存在。如果您运行了一些其他应用程序,那么最终iOS将终止您的应用程序以释放内存,如果您打开它,您会看到您的应用程序从头开始。
您可以采取几种不同的方法来保存数据,具体取决于数据类型以及您在应用中需要执行的操作。最简单的方法是将数据存储在NSUserDefaults
中 - 这适用于少量数据,如简单字符串。例如
[[NSUserDefaults standardUserDefaults] setObject:self.projectName forKey:@"projectKey"];
将保存一个字符串。和
self.projectName = [[NSUserDefaults standardUserDefaults] stringForKey:@"projectKey"];
会再次读回来。您可以在动作处理程序中使用第一行作为“保存”按钮,使用viewDidLoad
如果您需要存储更复杂的数据,那么您应该查看Core-Data,它提供映射到数据类的数据库样式存储,甚至是Parse.com等在线解决方案
您可以处理数据保存/加载的另一个位置是prepareForSegue:sender:
- 您可以检查源和目标视图控制器的segue名称和访问属性
答案 1 :(得分:0)
除非您将其删除或从超级视图中删除容器,否则您永远不会丢失输入的数据。