iOS使用UINavigation Bar删除输入到文本字段的数据

时间:2014-06-03 07:53:13

标签: ios uiviewcontroller uinavigationbar

当我从家乡的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];}

2 个答案:

答案 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)

除非您将其删除或从超级视图中删除容器,否则您永远不会丢失输入的数据。