2009-08-10 19 views
5

Desidero creare un'app Cocoa con un elenco di voci molto simili all'elenco ToDo di Things.app (see the screencast). La questione è se dovrei usareCome implementare un elenco personalizzato in Cocoa?

  1. un TableView,
  2. un CollectionView o
  3. una WebView.

Penso che potrebbe funzionare con tutti, ma quale si adatta meglio ai seguenti requisiti?

  • hanno un elenco di voci -> 1 colonna & molte righe
  • riordino con il drag & goccia
  • selezionare le voci singole & usare i tasti per le azioni come cancellare
  • aprire una voce: la riga dovrebbe espandi per visualizzare più campi di input
  • aspetto personalizzato: angoli arrotondati, ombreggiatura, sfumatura di sfondo

Finora la mia ricerca dice che TableView ha la maggior parte delle funzionalità, ma è più difficile da personalizzare nel suo aspetto, il CollectionView non ha il trascinamento & di rilascio (giusto?) Ma è facile da progettare e WebView richiederebbe molto sforzo per non danneggiare l'esperienza dell'utente e non posso associare direttamente il mio modello ai campi di input.

Quali sono i pro e i contro mi mancano e cosa consiglieresti di utilizzare?

risposta

4

Una visualizzazione Web non ha senso. Si potrebbe anche creare un'applicazione Web se si utilizza una WebView. Un NSCollectionView è più per dati simili a griglia, come elenchi TV all'ora.

NSTableView è l'unico che ha senso in questo caso. Ho implementato tutti e 5 i punti elenco con un NSTableView senza problemi. È necessario estendere NSTableView e fare un disegno personalizzato per l'aspetto personalizzato. Questa è la parte più difficile.

2
  • aprono una voce: la riga dovrebbe espandersi per mostrare più campi di input

Avete bisogno di un outline view. Una vista tabella è per liste piatte.

Nota che NSOutlineView è una sottoclasse di NSTableView, quindi tutte le funzionalità di visualizzazione tabella funzionano anche in una vista struttura.

+0

Hm, non espandere una riga in un NSOutlineView basta rivelare più "subrow"? Preferirei piuttosto cambiare l'altezza delle file e inserirvi più cose. Ha senso ciò? – Christian

+0

Sì. Potresti effettivamente utilizzare una vista tabella e implementare il metodo 'tableView: heightForRow:' delegate che hanno aggiunto il supporto per Tiger: http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/ Reference.html # // apple_ref/occ/instm/NSObject/tableView: heightOfRow: –

+1

Avrai anche bisogno di una cella personalizzata che puoi commutare tra i diversi stati di espansione. –

2

Ci sono persone che lo hanno già fatto. Uno che ho usato con successo è di Matteo Bertozzi ed è disponibile qui: http://th30z.netsons.org/2009/03/cocoa-sidebar-with-badges-take-2/ Potrebbe richiedere un bit di massaging per farlo funzionare correttamente (specialmente se hai bisogno di un complesso drag-and-drop), ma per le funzionalità di base , come ottenere i titoli delle sezioni e gli elementi nell'elenco, funziona in modo eccellente.

Modifica: Questo ha come up before ed è una domanda comune nella mailing list cocoa-dev. Here are some other options.

+0

Queste sono buone risorse ma non penso che la sidebar sia ciò di cui stiamo parlando qui. È la parte della "vista principale dei contenuti" delle cose, dove vivono gli attuali episodi. – jbrennan

+0

@jbrennan touché. Ho iniziato a guardare lo screencast collegato, ho visto la barra laterale e ho pensato che fosse quello che voleva. Potresti tecnicamente implementarlo con tutte le opzioni che ha chiesto nella domanda. Penso che dovrei leggere la domanda completamente prima di rispondere, eh? :) –

0

Mi sto avvicinando allo stesso problema nella mia app (con una lista grande simile alla lista delle cose da fare) e penso che una vista tabella avrebbe molto senso qui.

Il trucco è far sì che le celle ("righe") si espandano quando si fa doppio clic. Questo riguarda tutti i progressi che ho compiuto finora.

+0

Come hai fatto a espandere il doppio clic? – Christian

+0

Purtroppo non ho ancora capito bene! Quindi potrei sbagliarmi ... Sono molto più esperto con Cocoa-touch che con Cocoa, al momento. – jbrennan

1

Basta dare un'occhiata a Things.app stessa utilizzando "F-script anywhere".

Hanno utilizzato una sottoclasse di NSTableView chiamata "DetailTableView" che presenta gli elementi di questo tipo. Gli elementi todo compressi vengono implementati utilizzando una cella personalizzata denominata "ToDoCell", ma l'aspetto espanso che si ottiene quando si modifica è interessante. In tal caso hanno una vista personalizzata chiamata "ToDoEditView" che viene inserita come subview di DetailTableView quando richiesto. Sospetto che questa vista di modifica venga temporaneamente aggiunta come sottoscheda nella posizione corretta e la riga corrispondente della vista tabella venga ridimensionata temporaneamente mentre è presente.

Tutto piuttosto speculativo .. Mi piacerebbe sapere i dettagli di come è stato fatto. È un'interfaccia utente fantastica.

+0

Buon lavoro investigativo. Mi ero dimenticato di F-Script. Buono a dare un'occhiata anche alla discarica di classe. E perché non controllare anche la cartella Risorse del pacchetto, per vedere i suoi pennini. Queste sono tutte cose che mi hanno aiutato in passato. – jbrennan

+0

Sì .. vale la pena fare tutto quanto sopra per quanto riguarda le cose .. per l'ispirazione in quanto è un'applicazione così ben progettato. Inoltre ... Penso che il requisito di "aprire una fila" potrebbe essere meglio implementato usando l'approccio "inserisci una vista" usato da Things perché questo ti darebbe una grande flessibilità se riuscissi a farlo funzionare. Ovviamente il trucco (come sottolinea jbrennan) è far sì che la riga si espanda per lasciare spazio alla vista di dettaglio. Non ho alcuna esperienza in realtà provandolo però. –