【问题标题】:Must I keep my own UITableView "isSelected" array for multiselect?我必须为多选保留自己的 UITableView“isSelected”数组吗?
【发布时间】:2016-09-30 04:18:51
【问题描述】:

我正在尝试使用UITableview 并启用多项选择,并为所选行使用复选标记辅助视图。如果我在tableView:didSelectRow 中打开和关闭附件视图,这主要是有效的。

但是,我尝试构建一个 selectAll 方法,并且我发现在我旋转所有单元格并选择它们之后,如果我随后调用 reloadData(),所选单元格的数组正在被清除。

我怀疑重新加载表格会清除选择。在设置选定的标志和附件视图后,我不知道有任何其他方法可以绘制所有单元格。

我想知道是否需要保留自己的选定行数组。有没有其他人建造过这样的东西?这似乎是一个常见的场景。

感谢任何提示或示例代码。

【问题讨论】:

    标签: ios uitableview multi-select


    【解决方案1】:

    获取一个数组并将每个选定单元格的indexPath 添加到其中,并在cellForRowAt... 中放置一个条件,即如果数组包含特定的indexPath,则将其设置为选定。

    【讨论】:

    • 我想我明白了很多。还要提到语言(ObjC 或 Swift)。
    【解决方案2】:

    您可以采取两种方法。一种是跟踪选定的行号。为此,您可以使用 NSMutableIndexSet 或其 Swift 对应的 IndexSet

    Essentially, when a row is selected, add it to the set.当您取消选择它时,将其从集合中移除。在cellForRowAtIndexPath 中,您可以使用containsIndex 来确定是否应显示复选标记。

    由于您在重新加载表格时明确提到了选择问题,因此值得考虑存储行号(无论是在集合还是数组中)的问题,即行号可以更改。

    假设我选择了第 4,7 和 9 行,这些值存储在索引集中。当我重新加载数据时,新数据可能已插入“旧”第 8 行之后,所以现在我应该选择第 4,7 和 10 行,但我将选择 4,7 和 9还是。

    解决方案是为应该选择的数据存储某种唯一标识符。这将取决于您的数据,但假设您有一个对每个项目都是唯一的字符串。您可以将此字符串存储在 NSMutableSet 或 Swift Set 中,这再次使得使用 contains 检查是否选择了给定项目变得容易

    【讨论】:

      【解决方案3】:

      您需要像这样在 cellForRowAtIndexPath 方法中添加一些功能以及像这样的视图控制器代码

      让我们举一个相册应用的例子

      class CreateEvent: UIViewController,UITableViewDataSource,UITableViewDelegate {
      
      var yourArray :  [Photo] = [Photo]()
      //MARK: - Content TableView Methods
      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      
          let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath)
          let objPhoto = yourArray[indexPath.row]
          if objPhoto.isPhotoSelected == true
          {
              cell.accessoryType = .Checkmark
          }
      
          return cell
      
      }
      
      func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
      {
          let objPhoto = yourArray[indexPath.row]
          objPhoto.isPhotoSelected = true
          let cell = tableView.cellForRowAtIndexPath(indexPath)
          cell.accessoryType = .Checkmark
      
      }
      //MARK: Action Method
      
      func selectAllPhoto()
      {
          for objPhoto in yourArray
          {
              objPhoto.isPhotoSelected = true
          }
      
          tableView.reloadData()
      }
      }
      

      还有一件事你需要创建你的自定义对象,比如

      class Photo: NSObject {
      
      var photoName:String = ""
      var isPhotoSelected  = false
      
      }
      

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        多选的最佳方法是

        获取一个模型对象,其中获取所有属性和一个额外的boolean 属性(如isSelected)来保存选择。

        选择行时

        1. 从数组中获取相关对象
        2. 然后更新isSelected 布尔值(如isSelected = !isSelected)并重新加载表。

        全选情况下

        1. 只需遍历数组即可。
        2. 从数组中获取模型对象。
        3. 制作isSelected = true
        4. 循环完成后,重新加载表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-10
          • 2011-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-30
          相关资源
          最近更新 更多