2015-01-09 9 views
13

Attualmente sto utilizzando NSFetchedResultsController per gestire le visualizzazioni di tabella. Mi chiedo se ci sia un modo per aggiungere pulsanti aggiuntivi come il pulsante Elimina nell'operazione di scorrimento?aggiungi pulsanti aggiuntivi nello swipe di UITableView

Sto pensando di sottoclasse. Ma non trovare nulla di rilevante in documenti di aiuto ai miei problemi.

Grazie in anticipo.

risposta

46

Il tuo nome è fuorviante. NSFetchedResultsController non ha rilevanza per il tuo obiettivo finale. La sottoclasse creerebbe solo più lavoro del necessario, quello che vuoi esaminare è UITableViewRowAction. Questo gestisce molto facilmente & simile alla nuova UIAlertController, così si dovrebbe sentire estremamente confortevole con questo se hai già sguazzato con la UIAlertController

Una breve sinossi (retta dalla the docs) di UITableViewRowAction:

chiede il delegato per le azioni da visualizzare in risposta a uno scorrimento nella riga specificata. (obbligatorio) Utilizzare questo metodo quando si desidera fornire azioni personalizzate per una delle righe della tabella. Quando l'utente scorre orizzontalmente in una riga, la vista tabella sposta i contenuti della riga da parte per rivelare le tue azioni. Toccando uno dei pulsanti azione viene eseguito il blocco gestore memorizzato con l'oggetto azione. Se non si implementa questo metodo, la vista tabella mostra i pulsanti accessori standard quando l'utente fa scorrere la riga.

Un paio di note prima di iniziare:

  • Apple ha implementato questo in iOS 8: così pensare con attenzione la vostra destinazione di distribuzione. Se si sta eseguendo la codifica rigorosa per i0S8, questa è un'alternativa rapida e semplice alle librerie di terze parti o alla creazione di uno stile di modifica UITableView personalizzato. Se miri a mantenere la compatibilità per iOS7, le tue opzioni sono limitate con questo formato. SIDE NOTE ciò non causa un errore irreversibile nel codice, le app iOS7 non si bloccano, tuttavia, le azioni personalizzate semplicemente non verranno visualizzate.
  • non c'è molta personalizzazione al di là del titolo
  • I pro di questo, è che tutto è gestito con blocchi

Indipendentemente da ciò, per realizzare un costume UITableViewRowAction è necessario innanzitutto garantire la vostra tabella è modificabile chiamando il i seguenti metodi:

Come minimo, questi sono i due metodi che devono essere dichiarati prima di proseguire.

Per personalizzare in realtà i tuoi pulsanti di azione fila, seguire la linea guida generale come segue:

FASE 1 implementare il tableView:editActionsForRowAtIndexPath: metodo

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { 
} 

Come si può vedere, si tratta di un metodo di tipo NSArray esempio , quindi devi restituire un array.

PASSO 2 Aggiungere oggetti azione da passare nell'array. Un esempio:

{ 

UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
{ 
    // Delete something here 
}]; 

UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
{ 
    //Do whatever here : just as an example : 
    [self presentUIAlertControllerActionSheet]; 
}]; 

}  

È possibile modificare alcune proprietà di queste azioni di fila, ma vedere i documenti per opzioni di personalizzazione completa:

Per personalizzare i colori di sfondo di azione fila, semplicemente preforma è come la maggior parte altri azioni all'interno pulsanti:

delete.backgroundColor = [UIColor redColor]; 
more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; //arbitrary color 

STEP 3 Come accennato prima è necessario restituire un array nell'i Metodo nstance così il vostro codice completo dovrebbe essere simile al seguente:

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
    { 
     // Delete something here 
    }]; 
    delete.backgroundColor = [UIColor redColor]; 

    UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
    { 
     //Just as an example : 
     [self presentUIAlertControllerActionSheet]; 
    }]; 
    more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; 

    return @[delete, more]; //array with all the buttons you want. 1,2,3, etc... 
}  

Per ulteriori riferimenti: LINK TO DOCUMENTATION


CURA PER SWIFT SYNTAX

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? { 

var delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in 
    //Do something 
}) 
delete.backgroundColor = UIColor.redColor() 

var more = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in 
    //Do something 
}) 
more.backgroundColor = UIColor.blueColor() 

    return [delete, more] 
} 
+0

Grazie per il suggerimento su come modificare i titoli. Ma in realtà stavo cercando di fare qualcosa per personalizzare NSFetchedResultsController per abilitare btns aggiuntivi. La tua risposta fornisce un'altra soluzione per risolvere questo problema ma non è la mia intensione originale. Ancora grazie per la tua risposta. – AlexWei

+0

Forse potresti chiarire quindi @AlexWei Sono più che disposto a modificare la mia risposta. Il motivo per cui sono confuso è perché NSFetchedResultsController recupera semplicemente informazioni dai dati principali da visualizzare in UITableView. I pulsanti di azione fanno parte del controller UITableView non recuperabile. Se potessi pubblicare un link di riferimento o un'immagine al tuo problema, potrei capire meglio per aiutarti. – soulshined

+1

Sembra che mi sbagli completamente. Non avevo capito "I pulsanti di azione fanno parte del controller UITableView non fetch". Pensavo che i pulsanti appartengano al controller di recupero. :( – AlexWei

10

Tutti i complimenti a @ risposta accettata incantata.

ecco la versione Swift 3 di esso:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let delete = UITableViewRowAction(style: .default, title: "Delete") { (action:UITableViewRowAction, indexPath:IndexPath) in 
     print("delete at:\(indexPath)") 
    } 
    delete.backgroundColor = .red 

    let more = UITableViewRowAction(style: .default, title: "More") { (action:UITableViewRowAction, indexPath:IndexPath) in 
     print("more at:\(indexPath)") 
    } 
    more.backgroundColor = .orange 

    return [delete, more] 
} 
+0

Grazie per la conversione. – RichS