2015-09-30 5 views
6

Ho 2 sezioni nel mio UITableView.
Desidero che la prima sezione consenta la selezione di più celle e la seconda sezione per consentire solo una selezione singola.
Ho provato un po 'di codice ma non ha funzionato molto bene.
Codice in rapido se possibile. Grazie.UITableView - Selezione multipla E selezione singola

enter image description here

+0

Vuoi la seconda sezione per deselezionare la prima fila quando si seleziona la seconda fila? Inoltre, pubblicare il codice esistente aiuta. – Caleb

risposta

4

Forse si potrebbe implementare metodi delegato della vista tabella:

tableView(_:shouldHighlightRowAtIndexPath:)

e

tableView(_:didSelectRowAtIndexPath:)

... e determinare (da indexPath.row e indexPath.section) se la sezione pertinente supporta s ingl./selezione multipla (questo dipenderà dalla logica personalizzata del modello di dati -eg: "La sezione 0 supporta la selezione multipla ma la sezione 1 non"), e se supporta solo una selezione singola, controlla se è già selezionata una riga (accedendo a tableView.indexPathsForSelectedRows).

Se c'è una riga selezionata già, è possibile:

  1. Ritorno false da tableView(_:shouldHighlightRowAtIndexPath:), e
  2. far nulla (solo return) da tableView(_:didSelectRowAtIndexPath:) (non sono sicuro se questo metodo è effettivamente chiamato quando si restituisce false da shouldHighlight..., quindi forse controllarlo).
0

Se si desidera che la riga selezionata nella sezione 2 sia la nuova riga selezionata, ciò potrebbe funzionare automaticamente. Altrimenti, segui @ la risposta di NicolasMiari.

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 
    } 
} 

Non molto elegante, ma si spera che possa darvi un'idea.

2

Si può semplicemente provare questo. Questa soluzione funziona perfettamente per me. Fate una prova forse ha lavorato per gli altri ...

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if indexPath.section == 0 { 
     if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
      cell.accessoryType = .Checkmark 
     } 
    } 
    else { 
     if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
      cell.accessoryType = .Checkmark 
     } 
    } 
} 

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { 
    if indexPath.section == 1 { 
     if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
      cell.accessoryType = .None 
     } 
    } 
} 

Modificato: Per 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 
     } 
    } 
}