在TableView

时间:2017-11-15 11:13:40

标签: ios swift uitableview multipleselection

我花了很多时间搜索解决方案来限制UITableView中所选单元格的数量。

以下是我发现的一段代码:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if let selectedRows = tableView.indexPathsForSelectedRows {
        if selectedRows.count == limit {
            return nil
        }
    }

    return indexPath
}

问题是tableView.indexPathsForSelectedRows包含任何可见的单元格以及任何部分。

是否存在以下属性:tableView.selectedCellsForSection(section: 0)

感谢您的帮助!

更新1

这是一个包含多个选项的汽车的例子

var selectedOptions = [IndexPath : Option]() // Option can be for example, the color of the car

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let maxOptionForSection = car.options![indexPath.section]?.max
    let numberOfSelectedOptions = selectedOptions.filter { $0.key.section == indexPath.section }

    if numberOfSelectedOptions.count == maxOptionForSection {
        return nil
    }

    return indexPath
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let cell = tableView.cellForRow(at: indexPath) as? OptionCell {
        cell.checkButton.isChecked = true
        cell.option.isSelected = true
        selectedOptions[indexPath] = cell.option
    }
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if let cell = tableView.cellForRow(at: indexPath) as? OptionCell {
        cell.checkButton.isChecked = false
        cell.option.isSelected = false
        selectedOptions.removeValue(forKey: indexPath)
    }
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let optionCell = cell as! OptionCell

    if optionCell.option.isSelected {
        optionCell.checkButton.isChecked = true
    } else {
        optionCell.checkButton.isChecked = false
    }
}

1 个答案:

答案 0 :(得分:4)

这会将其限制为单击行的部分:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if let selectedRows = tableView.indexPathsForSelectedRows?.filter({ $0.section == indexPath.section }) {
        if selectedRows.count == limit {
            return nil
        }
    }

    return indexPath
}