UITableView - Multiple selection AND single select

2019-02-06 18:40发布

I have 2 sections in my UITableView.
I want the first section to allow multiple cell selection and the second section to allow only single selection.
I tried some code but didn't work very well.
Code in swift if possible. Thank you.

enter image description here

4条回答
我命由我不由天
2楼-- · 2019-02-06 18:48

Perhaps you could implement the table view's delegate methods:

tableView(_:shouldHighlightRowAtIndexPath:)

and

tableView(_:didSelectRowAtIndexPath:)

...and determine (from indexPath.row and indexPath.section) if the relevant section supports single/multiple selection (this will depend on your data model's custom logic -e.g.: "Section 0 supports multiple selection but section 1 does not"), and if it only supports single selection, check whether there is already a row selected (by accessing tableView.indexPathsForSelectedRows).

If there is a selected row already, you can:

  1. Return false from tableView(_:shouldHighlightRowAtIndexPath:), and
  2. Do nothing (just return) from tableView(_:didSelectRowAtIndexPath:) (I'm not sure if this method is actually called when you return false from shouldHighlight..., so perhaps check it).
查看更多
劫难
3楼-- · 2019-02-06 19:00

This is easily achievable in two lines as follows: (Swift 4)

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if sectionAllowsMultipleSelection {
        if let indexPathsInSection = tableView.indexPathsForSelectedRows?.filter ({ $0.section == indexPath.section && $0.row != indexPath.row }) {
            for selectedPath in indexPathsInSection {
                tableView.deselectRow(at: selectedPath, animated: false)
            }
        }
    }
}
查看更多
仙女界的扛把子
4楼-- · 2019-02-06 19:01

You can simply try this. This solution works for me perfectly. Give it a try maybe worked for others...

Swift-4

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.section == 0 {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.accessoryType = .checkmark
        }
    }
    else {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.accessoryType = .checkmark
        }
    }
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if indexPath.section == 1 {
        if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
            cell.accessoryType = .none
        }
    }
}
查看更多
\"骚年 ilove
5楼-- · 2019-02-06 19:07

If you want the selected row in section 2 to be the new selected row, this might work for you. Else, go with @NicolasMiari's answer.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath.section == 1 {
        for i in 0..tableView.numberOfRowsInSection(indexPath.section) - 1 {
            let cell: UITableViewCell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: i, inSection: indexPath.section))!
            if (i == indexPath.row) {
                cell.accessoryType = .Checkmark
                cell.selected = false
            }
            else {
                cell.accessoryType = .None
            }
        }
    }
    else {
        //Do whatever for the first section
    }
}

Not very elegant, but hopefully it will give you an idea.

查看更多
登录 后发表回答