Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITableView - Multiple selection AND single selection

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

like image 236
user3722523 Avatar asked Sep 30 '15 03:09

user3722523


3 Answers

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
        }
    }
}
like image 150
AshWinee Dhakad Avatar answered Sep 19 '22 13:09

AshWinee Dhakad


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).
like image 31
Nicolas Miari Avatar answered Sep 18 '22 13:09

Nicolas Miari


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)
            }
        }
    }
}
like image 22
Anand Avatar answered Sep 22 '22 13:09

Anand