2009-08-10 12 views
5

Quiero crear una aplicación Cocoa con una lista de entradas muy similar a la lista ToDo de Things.app (see the screencast). La pregunta es si debo utilizar¿Cómo implemento una lista personalizada en Cocoa?

  1. un TableView,
  2. un CollectionView o
  3. una vista Web.

Creo que podría funcionar con todas ellas, pero ¿cuál se adapta mejor a los siguientes requisitos?

  • tienen una lista de entradas -> 1 columna & muchas filas
  • reordenamiento con arrastrar & gota
  • seleccionar entradas individuales & teclas de uso para acciones como eliminar
  • abrir una entrada: la fila debe expandir para mostrar más campos de entrada
  • apariencia personalizada: esquinas redondeadas, sombra, gradiente de fondo

Hasta ahora mi investigación dice que el TableView tiene la mayor parte de la funcionalidad, pero es más difícil de personalizar en su apariencia, CollectionView no tiene arrastre & drop (¿no?) Pero es fácil de diseñar y WebView tomaría mucho esfuerzo para no dañar la experiencia del usuario y no puedo vincular mi modelo directamente a los campos de entrada.

¿Qué pros y contras me falta y qué recomendarías?

Respuesta

4

Un WebView no tiene sentido. También puede crear una aplicación web si usa un WebView. Un NSCollectionView es más para datos tipo cuadrícula, como listados de TV por hora.

NSTableView es el único que tiene sentido en este caso. Implementé los 5 puntos de viñeta con un NSTableView sin problema. Debe extender NSTableView y hacer un dibujo personalizado para el aspecto personalizado. Esa es la parte más difícil.

2
  • abren una entrada: la fila debe expandirse para mostrar más campos de entrada

Es necesario un outline view. Una vista de tabla es para listas planas.

Tenga en cuenta que NSOutlineView es una subclase de NSTableView, por lo que todas las funciones de vista de tabla también funcionan en una vista de esquema.

+0

Hm, ¿no se expande una fila en un NSOutlineView solo revela más "subrows"? Prefiero cambiar la altura de las filas y poner más cosas en él. ¿Esto tiene sentido? – Christian

+0

Sí. En realidad, podría usar una vista de tabla e implementar el método de delegado 'tableView: heightForRow:' al que agregaron soporte en Tiger: http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/ Reference.html # // apple_ref/occ/instm/NSObject/tableView: heightOfRow: –

+1

También necesitará una celda personalizada para alternar entre los diferentes estados de expansión. –

2

Ya hay personas que ya lo hicieron. Uno que he usado con éxito es Matteo Bertozzi y está disponible aquí: http://th30z.netsons.org/2009/03/cocoa-sidebar-with-badges-take-2/ Puede tomar bit de masaje para que funcione correctamente (especialmente si necesita un comportamiento complejo de arrastrar y soltar), pero para una funcionalidad básica , como obtener los títulos de la sección y los elementos en la lista, funciona de manera excelente.

Editar: Esto tiene come up before y es una pregunta común en la lista de correo de cocoa-dev. Here are some other options.

+0

Esos son buenos recursos, pero no creo que la barra lateral sea de lo que estamos hablando aquí. Es la parte de "vista de contenido principal" de Things, donde viven todos los reales. – jbrennan

+0

@jbrennan touché. Empecé a ver el screencast vinculado, vi la barra lateral y asumí que eso era lo que él quería. Podría implementarlo técnicamente con cualquiera de las opciones que hizo en la pregunta. Creo que debería leer la pregunta completamente antes de responder, ¿eh? :) –

0

Me estoy acercando al mismo problema en mi aplicación (con una gran lista similar a la lista Cosas pendientes) y creo que una vista de tabla tendría mucho sentido aquí.

El truco está en hacer que sus celdas ("filas") se expandan cuando se hace doble clic. Eso es todo el progreso que he hecho hasta ahora.

+0

¿Cómo obtuviste la expansión al hacer doble clic en el trabajo? – Christian

+0

¡Tristemente todavía no he conseguido que funcione! Así que podría estar equivocado ... Tengo mucha más experiencia con Cocoa-touch que Cocoa, actualmente. – jbrennan

1

Acabo de echar un vistazo a Things.app usando "F-script anywhere".

Han usado una subclase de NSTableView llamada "DetailTableView" que presenta los elementos condensables de tareas pendientes. Los elementos colapsables de tareas pendientes se implementan utilizando una celda personalizada llamada "ToDoCell", pero la apariencia expandida que obtienes al editar es interesante. En ese caso, tienen una vista personalizada llamada "ToDoEditView" que se inserta como una subvista de DetailTableView cuando es necesario. Sospecho que esta vista de edición se agrega temporalmente como una subvista en la ubicación correcta y la fila correspondiente de la tabla se cambia de tamaño temporalmente mientras está presente.

Todo bastante especulativo. Me encantaría saber los detalles de cómo se hizo esto. Es una interfaz de usuario increíble.

+0

Buen trabajo de detective. Me había olvidado de F-Script. También es bueno echarle un vistazo al vertedero de clases. Y por qué no echar un vistazo a la carpeta de Recursos del paquete de la aplicación también, para ver sus plumillas. Estas son todas las cosas que me han ayudado en el pasado. – jbrennan

+0

Sí ... vale la pena hacer todo lo anterior con respecto a Things ... para obtener inspiración, ya que es una aplicación tan bien diseñada. Además ... Creo que el requisito de "abrir una fila" podría implementarse mejor utilizando el enfoque de "insertar una vista" utilizado por Things porque esto le daría una gran flexibilidad si pudiera hacerlo funcionar. Obviamente, el truco (como señala jbrennan) consiste en hacer que la fila se expanda para dar cabida a la vista de detalle. Sin embargo, no tengo ninguna experiencia realmente probando esto. –

Cuestiones relacionadas