【问题标题】:iPhone - simplest way to hold a tableview's state?iPhone - 保持表格视图状态的最简单方法?
【发布时间】:2011-05-16 17:13:34
【问题描述】:

我目前有一个包含 7 个单元格的简单表格视图。 When a row is selected I add a checkmark to a cell and vice-versa when a cell that is already checked is selected it is unchecked.

但是,当我退出 tableview 并返回时,所有复选标记都消失了。

我想知道 IOS 中保持选中单元格状态的最简单解决方案是什么,这样当我返回表格视图时,选中单元格的复选标记仍然存在?

【问题讨论】:

    标签: iphone ios uitableview


    【解决方案1】:

    不久前,我阅读了许多关于该主题的帖子。它表明我找不到对我有帮助的确切那个,但这里有一些我认为很好的:

    【讨论】:

      【解决方案2】:

      最简单的方法是将这些检查状态保存在表格视图的某个位置。这假设当您离开屏幕时,您的表格视图会保留在内存中的某个位置。如果 table view 没有保存在内存中(当你决定导航到那里时分配它,并且在你离开时被释放),那么将它保存在应用程序委托中的某个位置可能是最简单的,因为我们知道在应用程序生命周期内保留在内存中

      【讨论】:

      • 这是一个非常糟糕的建议,并且违反了 MVC 模式。他所追求的是提供单元格的数据源的状态,而不是 tableview 本身。
      • 我不明白为什么这会破坏 MVC 模式,除了我选择描述的用于保存数据的位置不是明确的“模型”对象,或者为什么这使它变得不好建议。
      • 您选择的描述数据保存位置的位置是视图对象(tableview),即使在视图上保存此类信息很好,它也是错误的位置,它会是在这种情况下,单元格的属性。然而,即使这样也是错误的,因为这是用于填充单元格的数据,而不是单元格的绘图代码等的一部分。它是经典的数据模型,数据。
      • 表格知道应该用什么填充单元格有什么问题,特别是如果您使用的是tableView:cellForRowAtIndexPath:
      • 那不是tableview...那是它的数据源,这是正确的做事方式,正如我之前提到的。
      【解决方案3】:

      您要做的是在您的数据模型上提供每个单元格设置的数据,添加一个标志(如果您还没有标志),该标志将用于指示这种情况。确保根据特定单元格的数据模型在 tableView:cellForRowAtIndexPath: 中的单元格上设置复选标记。

      当您返回它时,如果您的数据源没有更改,当 tableview 在显示 tableview 之前再次设置其单元格时,它将使用该数据根据数据源中的设置显示复选标记.

      【讨论】:

        【解决方案4】:

        在 sqlite 中存储 tableview 状态

        【讨论】:

          【解决方案5】:

          将状态保存在 NSUserDefaults 中。

          在您的 didSelectRowAtIndexPath tableView 委托方法中,使用以下内容设置用户默认值:

          NSUInteger defaultsCheckedRow=[[NSUserDefaults standardUserDefaults] integerForKey:@"rowForCheckedCellInNameOfTableViewController"];
          if (defaultsCheckedRow==indexPath.row){
             // deselect the row 
             defaultsCheckedRow=defaultsCheckedRow*-1;
          }else{
             defaultsCheckedRow=indexPath.row;
          }
          [[NSUserDefaults standardUserDefaults] setInteger: defaultsCheckedRow forKey: "rowForCheckedCellInNameOfTableViewController"]
          [[NSUserDefaults standardUserDefaults] synchronize];
          [self.tableView reloadData];
          

          然后在您的 cellForRowAtIndexPath: 数据源委托方法中,您可以执行以下操作:

          NSUInteger defaultsCheckedRow=[[NSUserDefaults standardUserDefaults] integerForKey:@"rowForCheckedCellInNameOfTableViewController"];
          if (indexPath.row==defaultsCheckedRow){
             cell.accessoryType=UITableViewCellAccessoryCheckmark;
          }else{
             cell.accessoryType=UITableViewCellAccessoryNone;
          }
          

          【讨论】:

            猜你喜欢
            • 2018-08-26
            • 1970-01-01
            • 2021-10-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-19
            相关资源
            最近更新 更多