【问题标题】:iOS Using the UINavigation Bar Erases Data Entered into Text FieldsiOS 使用 UINavigation Bar 擦除输入到文本字段中的数据
【发布时间】:2014-06-03 07:53:12
【问题描述】:

当我从我家转到另一个家时,我会在文本字段中输入数据。我在顶部有一个导航栏,如果我点击后退按钮转到主页,我会丢失所有输入的数据。将数据保存在这些字段中的有效方法是什么?

谢谢。

编辑: 也许这会有所帮助,但是当我加载屏幕时,它会调用该方法-

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

但是当我返回上一个视图控制器或点击 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];}

【问题讨论】:

  • 您的意思是您在视图控制器 1 中。您推送视图控制器 2,输入一些数据,然后回击视图控制器 1,然后如果您推送视图控制器 2,则您输入的数据丢失?
  • 您能否更新问题以显示您编写的代码以在视图控制器 2 将被移除和再次呈现时保存数据?
  • 我认为这就是我所缺少的,我不知道如何实现它。现在我只有它,所以它将数据保存到 csv 文件。我可以证明这一点。我只是不知道在离开 segue 时如何将数据保存在那里。

标签: ios uiviewcontroller uinavigationbar


【解决方案1】:

当您推送第二个视图控制器时,会创建第二个视图控制器的新实例,这就是显示的内容。当您按下后退按钮时,此实例将被销毁,并且原始视图控制器会弹回。当您再次访问第二个视图控制器时,它是另一个新实例,因此所有字段都是空的。

如果您按下主页按钮,您的应用程序将暂停,但第二个视图控制器实例仍在内存中,因此如果您立即返回到您的应用程序,值仍然存在。如果您运行其他一些应用程序,那么最终 iOS 会终止您的应用程序以释放内存,并且如果您打开它,您会看到您的应用程序从头开始。

您可以采用多种不同的方法来持久化数据,具体取决于数据的类型以及您需要在应用中对其执行的操作。最简单的方法是将数据存储在NSUserDefaults - 这适用于少量数据,例如简单的字符串。例如

[[NSUserDefaults standardUserDefaults] setObject:self.projectName forKey:@"projectKey"]; 

将保存一个字符串。和

self.projectName = [[NSUserDefaults standardUserDefaults] stringForKey:@"projectKey"]; 

会再读一遍。您可以将动作处理程序中的第一行用于“保存”按钮,将第二行用于viewDidLoad

如果您需要存储更复杂的数据,那么您应该查看 Core-Data,它提供映射到数据类甚至在线解决方案(如 Parse.com)的数据库样式存储

您可以处理数据保存/加载的另一个位置是prepareForSegue:sender: - 您可以检查源和目标视图控制器的 segue 名称和访问属性

【讨论】:

  • 好的。我正在使用 prepareForSegue 将数据从那里传递到我的下一个 segue。如果我以相同的方法对您提供的代码进行编码,这也可以与后退按钮一起使用:[[NSUserDefaults standardUserDefaults] setObject:self.projectName forKey:@"projectKey"];然后将下一个代码添加到 viewDidLoad?谢谢。
  • 是的 - 但您应该检查转场标识符以确保您保存在后退/展开转场而不是推送转场
  • 我试图在点击后退按钮时使用 standardUserDefaults 方法来实现它,但我不确定当它从 viewcontroller 1 到 viewcontroller 2 时我刚刚寻找的 segue id 是如何实现的. 虽然通过在保存时调用该方法,但我能够像您建议的那样工作,所以谢谢。
  • 您也可以使用viewWillDisappear 方法,因为它会在您的视图退出之前调用
  • 谢谢保罗!你摇滚!
【解决方案2】:

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

【讨论】:

  • 我不确定如何从超级视图中删除容器。你能解释一下吗?我对超级视图的功能仍然很陌生。
  • 当新的UIViewController 被推送时,前一个- (void)viewWillDisappear:(BOOL)animated(void)viewDidDisappear:(BOOL)animated 方法被调用。检查removeFromSuperview 的这些方法此外,如果您提供了键盘,它将自动关闭,这将调用UITextViewUITextField 代表。
  • 我没有覆盖 - (void)viewWillDisappear:(BOOL)animated 或 (void)viewDidDisappear:(BOOL)animated。这是否意味着我需要这样做?
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多