2011-04-03 9 views

Respuesta

16

Tengo una subclase personalizada NSArrayController que realiza un montón de tareas. Elegí implementar estas cosas allí porque puedo disfrutar de la comodidad total de las ataduras y demás. Esto es lo que yo uso esto ahora para:

  • A veces algunos artículos deben estar ocultos y algunos deben indicar
  • que realizar la clasificación a medida (es decir, agrupar) en el controlador
  • Es alimentado por los elementos de una diferente tipo que devuelve (obtener elementos, devolver nodos de elementos - objetos ficticios que envían la mayoría de las cosas)
  • También lo uso para mantener los criterios de filtro y las opciones de búsqueda actualmente en exhibición
  • Además, agregué delegado NSTableView y datos soporte de fuente que permite arrastraraplicación correcta 0 caída en el controlador
  • También puedo personalizar la información de herramientas para la celda en la que hay

Sí, y así sucesivamente. Básicamente esto todo se reduce a esta esencia: subclase NSArrayController si quieres diferentes de datos de la que pones en

Max

+0

Lista informativa Máx; ¿Qué estás haciendo para personalizar la información sobre herramientas? –

+0

@Mike Abdullah: Es parte del delegado NSTableView, donde simplemente implemento este método: 'tableView: toolTipForCell: rect: tableColumn: row: mouseLocation:' –

8

Una cosa que me gusta hacer cuando uso un controlador de array con una vista de tabla es anular add: para publicar una notificación para que el nuevo elemento se seleccione y se abra para su edición inmediata. De hecho, me envió esta encima en CocoaDev hace un tiempo:

// Subclass of NSArrayController 

- (void)awakeFromNib 
{ 
    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(objectAdded:) 
               name: @"Object Added" 
               object: self] 
} 

- (void)add: (id)sender 
{ 
    [super add: sender] 
    NSNotification * note = [NSNotification 
           notificationWithName: @"Object Added" 
               object: self] 
    // The add method doesn't really take effect until this run loop ends, 
    // (see NSArrayController docs) so the notification needs 
    // to wait to post. Thus, enqueue with NSPostWhenIdle 
    [[NSNotificationQueue defaultQueue] enqueueNotification: note 
               postingStyle: NSPostWhenIdle] 
} 

- (void)objectAdded: (NSNotification *)note 
{ 
    // when the notification finally arrives, tell the table to edit 
    [[self contentTable] editColumn:0 
            row:[self selectionIndex] 
           withEvent:nil 
           select:YES] 
} 

Por supuesto que es posible hacer similar con un controlador que no es una subclase NSArrayController; esta es solo la primera forma que descubrí.

+0

Puede anular '-addObject:' en lugar de '-add:' y publicar la notificación normalmente –

1

Tengo una aplicación que necesita establecer un nombre de archivo oculto cuando el usuario agrega un objeto: el método de agregar en una clase personalizada ArrayController es el lugar indicado para hacerlo.

Edición - En realidad, volver a leer mi Hillegas, reemplazar newObject es la mejor manera. Todavía requiere una subclase de NSArrayController.

0

I subclases controladora de la matriz para devolver el objeto deseado al invocar - (id) newObject;

Normalmente tiene .h & .m archivo para cada clase en su proyecto y el controlador de matriz crea un objeto específico basado en el nombre de la clase leyendo esos archivos.

Pero cuando solo tiene un archivo .h .m o una clase (p. Ej .: Entidad) que puede devolver cualquier objeto (por ejemplo, empleado, cliente, leyendo definiciones modales almacenadas) según su necesidad, tiene que subclasificar arraycontroller porque el nombre de la clase permanece igual (Entity) si necesita un objeto empleado o un objeto de cliente.

0

Utilizo una subclase de NSArrayController para nombrar las acciones Deshacer/Rehacer para agregar y eliminar objetos en mi aplicación Core Data.
(No fue mi propia idea, el crédito va para el usuario @MikeD que respondió my question on this matter.)

Anule el método - newObject.

- (id)newObject 
{ 
    id newObj = [super newObject]; 

    NSUndoManager *undoManager = [[[NSApp delegate] window] undoManager]; 
    [undoManager setActionName:@"Add *insert custom name*"]; 

    return newObj; 
} 

También el método - remove:sender.

- (void)remove:(id)sender 
{ 
    [super remove:sender]; 

    NSUndoManager *undoManager = [[[NSApp delegate] window] undoManager]; 
    [undoManager setActionName:@"Remove *insert custom name*"]; 
} 
Cuestiones relacionadas