Domanda

Per l'iPhone, è possibile configurare un UITableView in modo tale da consentire la selezione multipla?

Ho provato a sovrascrivere -setSelected: animato: per ogni UITableViewCell, ma cercare di confondere il comportamento richiesto è complicato in quanto è difficile separare le deselezioni reali da quelle in cui UITableView pensa che io '' ho deselezionato a causa della selezione di un'altra cella!

Spero che qualcuno possa aiutarti!

Grazie,

Nick.

È stato utile?

Soluzione

Il modo migliore per farlo sarebbe un segno di spunta per riga selezionata.

Puoi farlo impostando il tipo di accessorio sulle istanze UITableViewCell selezionate su UITableViewCelAccessoryCheckmark.

Per deselezionare la riga, impostarla su UITableViewCellAccessoryNone.

Per enumerare quali celle / righe sono state selezionate (diciamo, facendo clic su un pulsante), basta scorrere le celle della tabella cercando UITableViewCellAccessoryCheckmark. Oppure, gestisci alcuni NSSet o simili nel delegato della vista tabella nella sezione "selezionato" " metodi delegati.

Altri suggerimenti

Le seguenti proprietà dovrebbero funzionare correttamente se stai sviluppando un'app per iOS5.0 +

self.tableView.allowsMultipleSelection = YES;

Utilizzare il seguente codice per impostare i tipi di accessori per celle:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];


    if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
        thisCell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{
        thisCell.accessoryType = UITableViewCellAccessoryNone;

    }
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {

//add your own code to set the cell accesory type.
return UITableViewCellAccessoryNone;
}

Jeff Lamarche ha un tutorial su come farlo qui:

http: //iphonedevelopment.blogspot. com / 2008/10 / table-view-multi-righe-edit-mode.html

Non ho provato il codice ma è stato nella mia testa per un po ', sapendo che verrà il giorno in cui ne avrò bisogno.

Ho eseguito il backport di consenteMultipleSelectionDuringEditing e consenteMultipleSelection da iOS5 a iOS precedente. Puoi fork su https://github.com/ud7/UDTableView-allowsMultipleSelection

È la sostituzione in sostituzione e l'unica cosa che devi fare è cambiare UITableView in UDTableView (nel generatore di codice o interfaccia)

Dall'HIG:

  

Le viste tabella forniscono feedback quando gli utenti selezionano gli elementi dell'elenco. In particolare, quando è possibile selezionare un elemento, il   la riga contenente l'elemento viene evidenziata brevemente quando un utente lo seleziona per mostrare che la selezione è stata ricevuta.   Quindi, si verifica un'azione immediata: viene rivelata una nuova vista o la riga visualizza un segno di spunta per indicare   che l'elemento è stato selezionato. La riga non rimane mai evidenziata, poiché le viste della tabella non visualizzano a   stato selezionato persistente.

Dovrai ruotare il tuo stile di selezione multipla, con qualcosa come Mail o usando l'accessorio segno di spunta sulle tue celle.

Ragazzi per la selezione multipla, basta solo

self.tableView.allowsMultipleSelection = YES;

su viewDidLoad e

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = NO; 
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = YES;
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryNone;
}

Se stai provando a fare qualcosa come la selezione multipla di Mail (per eliminare la posta, ad esempio), probabilmente dovrai gestire da solo tutta la selezione. La selezione di più righe non è qualcosa di standard sull'iPhone. Mail risolve questo problema usando segni di spunta per indicare quali righe sono state selezionate.

la riga evidenziata in blu come indicatore del fatto che una riga sia selezionata è effettivamente sconsigliata in base a HIG pagina 121. I segni di spunta faranno il trucco.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    int selectedRow = indexPath.row;
    cout << "selected Row: " << selectedRow << endl;
    UITableViewCell *indexPathForCell = [tableView cellForRowAtIndexPath:indexPath];
    if (indexPathForCell.accessoryType == UITableViewCellAccessoryNone) {
        indexPathForCell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        indexPathForCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

quindi aggiungi la tua matrice o il modo in cui desideri archiviare i dati che sono stati selezionati.

Stavo cercando lo stesso problema e la risposta di Bhavin Chitroda lo ha risolto per me, ma con qualche aggiunta per mantenere il segno di spunta com'era durante lo scorrimento.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        if ( [array indexOfObject:indexPath] == NSNotFound ) {
            [array addObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            [array removeObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }

}

L'aggiunta:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Your code here
.
.
.
    if ( [array indexOfObject:indexPath] == NSNotFound ) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    return cell;

}

Nota: questo non funziona in iOS 4+. Questa è una costante privata e non documentata. Non usarlo.

Se non hai intenzione di inviare la tua app all'App Store, puoi invocare la modalità di modifica multi-riga implementando il seguente metodo nel tuo delegato UITableViewController:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 3; // Undocumented constant
}

Testato con iOS4.3 - 6.0

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {

    if ([controller.searchResultsTableView respondsToSelector:@selector(allowsMultipleSelectionDuringEditing)]) {
        controller.searchResultsTableView.allowsMultipleSelectionDuringEditing = YES;
    }
    else {
        controller.searchResultsTableView.allowsSelectionDuringEditing = YES;
    }
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellAccessoryCheckmark;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top