【问题标题】:iOS views retaining dataiOS 视图保留数据
【发布时间】:2014-04-28 11:58:50
【问题描述】:

我目前正在开发一个带有故事板的多视图应用程序。在每个视图中,用户可以输入数据,通常通过文本框或按钮输入。然后将这些数据存储在数组中。

我的问题是:当我转移回一个窗口时,viewDidLoad 被调用,因此重置了所有数据。是否有一种简单的方法(无需简单地加载我的数组备份)来保留这些数据,就好像没有调用 viewDidLoad 一样?是否有在加载应用程序时调用的方法,而不仅仅是视图?或者也许是第一次只调用viewDidLoad 的方法?

我知道我可以通过加载我的数组来解决这个问题,我只是想知道是否有更简单、更优雅的解决方案。

编辑:

似乎每次我转到另一个视图时都会触发我的视图加载。我正在使用故事板segues。

【问题讨论】:

  • 在core data中存储之前是否加载过,在viewdidload中查看
  • 我以前从未使用过核心数据。我该怎么做?
  • 如果你的数据结构很简单,你可以使用NSUserDefaults 或 plists。
  • 如果你需要经常访问你的数组并且它不是很大,你可以为它创建一个单例管理器。 (鉴于内容不需要持久化)
  • ViewDidLoad 正是您正在寻找的功能。不像例如ViewDidAppear,它应该只被调用一次,当你的视图第一次加载时。因此,可能您正在创建视图的新实例(例如,如果您调用另一个 segue 而不是展开或弹出),或者您的视图由于其他原因从内存中卸载。

标签: ios objective-c uistoryboard viewdidload


【解决方案1】:

您可以使用NSUserDefaults。在viewdidload 检查您是否有数据然后加载数据或显示默认值。每次调用一个视图加载的viewDidLoad。

【讨论】:

    【解决方案2】:

    您可以创建根的子 ViewControllers 属性,这样当您在它们之间移动时它们不会被释放。显然需要注意的是,当应用程序被终止时,数据会丢失。

    对于数组数据的永久存储,我建议查看NSCoding。

    【讨论】:

      【解决方案3】:

      如果有人有兴趣了解我是如何解决这个问题的,我使用了 p-lists。这是一个很好的解决方法,但无论如何数据都必须在 p-list 中,所以这对我的要求来说并不算多:

      第一:

      确保我们一开始要运行一次的代码运行一次:

       static dispatch_once_t once;
      dispatch_once(&once, ^ { 
      //all code we want to run once goes here
      }
      

      其次,当视图消失时,将所有需要的数据写入 plist:

       (void) viewDidDisappear:(BOOL)animated
      {
      NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString *documentFolder = [path objectAtIndex:0];
      filePath = [documentFolder stringByAppendingFormat:@"wantedData.plist"];
      [wantedDataArray writeToFile:filePath atomically:YES];
      }
      

      最后,当视图加载(或出现)时,用 p-list 的内容填充数组:

          retrievedDataArray = [NSArray arrayWithContentsOfFile:filePath];
      

      【讨论】:

      • 如果您需要在应用程序启动之间保留数据,可以将数据保存到文件中,但您首先需要了解为什么会出现问题,这是由正如@user1459524 在 cmets 中所说,使用 segues(不是展开 segues)“返回”到以前的视图。
      • 太准确了!托尼,你得听 RD 关于这个的。
      • (我打算幽默地建议您将数据保留在 parse.com 上......但这就是您在这里所做的!)顺便说一句,如果您对“子容器”感到困惑",这是我的XXX长解释stackoverflow.com/a/23403979/294884
      【解决方案4】:

      从我收集到的 cmets 中,最好的方法是使用 unwind segue。这可以按如下方式完成:

      在我想放松的转场中插入 IBAction:

      .h

      - (IBAction)unwindToMain:(UIStoryboardSegue *)unwindSegue;
      

      .m

      - (IBAction)unwindToMain:(UIStoryboardSegue *)unwindSegue
      {
          //Allows us to unwind back to this segue
      }
      

      然后只需在我的第二个视图控制器中的按钮之间拖动 ctrl 并选择 segue。

      可以在这里找到一个很好的教程:

      What are Unwind segues for and how do you use them?

      【讨论】:

        猜你喜欢
        • 2010-11-16
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多