我必须为多重选择保留自己的UITableView“isSelected”数组吗?

时间:2016-09-30 04:18:51

标签: ios uitableview multi-select

我正在尝试使用带有多项选择UITableview和所选行的复选标记附件视图。如果我打开和关闭tableView:didSelectRow中的配件视图,这大部分都有效。

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

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

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

赞赏任何提示或示例代码。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你需要在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

}

希望这会对你有所帮助

答案 2 :(得分:0)

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

基本上,当选择一行时,将其添加到集合中。取消选择后,将其从集中移除。在cellForRowAtIndexPath中,您可以使用containsIndex来确定是否应显示复选标记。

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

假设我选择了行4,7和9,这些值存储在索引集中。当我重新加载数据时,可能已经在" old"之后插入了新数据。第8行,所以现在我应该选择第4,7行和第10行,但我仍然会选择4,7和9。

对此的解决方案是为应选择的数据存储某种唯一标识符。这取决于您的数据,但是您说每个项目都有一个唯一的字符串。您可以将此字符串存储在NSMutableSet或Swift Set中,这样可以轻松检查是否使用contains选择了某个项目

答案 3 :(得分:0)

多重选择的最佳方法是

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

如果选择行

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

    1. 只需遍历数组。
    2. 从数组中获取模型对象。
    3. 制作isSelected = true
    4. 完成循环后,重新加载表格。
    5. 希望这个概念可以帮助你建立自己的逻辑。

      快乐的编码......