Swift 在每个部分中选择一个单元格

Swift selecting a cell in each section

我在 select 在 swift 中输入多个单元格时遇到一点问题。

我不想让用户 select 任意多的单元格,他只能 select 三个单元格(每个部分一个)。为了更清楚,我会给你一些代码。

我分为三个部分:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 3
}

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerCell = tableView.dequeueReusableCellWithIdentifier("HeaderCell") as! CustomHeaderCell

    /* let  headerCell = tableView.dequeueReusableCellWithIdentifier("HeaderCell") as CustomHeaderCell */
 //   headerCell.backgroundColor = UIColor.set(#E6E2E1)

    switch (section) {
    case 0:
        headerCell.headerLabel.text = "Bundesliga";
        //return sectionHeaderView
    case 1:
        headerCell.headerLabel.text = "BBVA";
        //return sectionHeaderView
    case 2:
        headerCell.headerLabel.text = "BPL";
        //return sectionHeaderView
    default:
        headerCell.headerLabel.text = "Other";
    }

    return headerCell
}

我想在每个 League 中给用户例如 5 Club 到 select。他必须 select 他最喜欢的 Club 每个 League。我不想做这样的事情:

tableView.allowsMultipleSelection = true

因为我想在每个部分中只允许一个选择。我怎样才能像这样限制用户?

这应该适合你:

override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
    let selectedIndexPaths = indexPathsForSelectedRowsInSection(indexPath.section)

    if selectedIndexPaths?.count == 1 {
        tableView.deselectRowAtIndexPath(selectedIndexPaths!.first!, animated: true)
    }

    return indexPath
}

func indexPathsForSelectedRowsInSection(section: Int) -> [NSIndexPath]? {
    return (tableView.indexPathsForSelectedRows() as? [NSIndexPath])?.filter({ (indexPath) -> Bool in
        indexPath.section == section
    })
}

Swift 4.1 更新 - 选中单元格

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    // Find any selected row in this section
    if let selectedIndexPath = tableView.indexPathsForSelectedRows?.first(where: {
        [=11=].section == indexPath.section
    }) {
        // Deselect the row
        tableView.deselectRow(at: selectedIndexPath, animated: false)
        // deselectRow doesn't fire the delegate method so need to
        // unset the checkmark here
        tableView.cellForRow(at: selectedIndexPath)?.accessoryType = .none
    }
    return indexPath
}

override func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath? {
    // Prevent deselection of a cell
    return nil
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}

对于 tableView,请确保设置...

allowsMultipleSelection = true

选择:Interface Builder

中的MutlipleSelection

并为每个单元格设置

selectionStyle = .none

选择:Interface BuilderNone