Pregunta

Tengo una pequeña NSTableView con una casilla de verificación. Siempre que la casilla de verificación no está marcada, quiero una de las NSCells adyacentes a inactivado en gris y de difícil acceso.

Sin embargo, no puedo encontrar la manera de abordar sólo una célula específica. -dataCellForRow de NSTableColumn siempre cambia la celda plantilla para toda la columna de la tabla.

¿Cómo puedo tener acceso a una sola célula?

Editar:. I llenar la vista de tabla utilizando el protocolo NSTableViewDataSource

¿Fue útil?

Solución

No "acceder a una celda". NSTableView solicita datos sólo cuando sea necesario, no llenarla o controlar directamente.

En su lugar, se crea un objeto de controlador que implementa el NSTableViewDatasource y protocolos opcionalmente NSTableViewDelegate. La vista de tabla a continuación, envía los mensajes de origen de datos a su controlador y sus suministros controlador los datos apropiados.

Puede permitir la edición de un objeto está representada en la vista de tabla mediante la aplicación del método de ‑tableView:setObjectValue:forTableColumn:row: fuente de datos. Este método será llamado en el objeto controlador cuando el usuario hace clic en la casilla de verificación. Es responsabilidad del controlador para actualizar el modelo de forma adecuada.

Cuando se actualiza el modelo, el controlador debe decirle a la vista de tabla para recargar. La vista de tabla le pedirá entonces el controlador para el valor de cualquier célula que requiere la pantalla utilizando el método ‑tableView:objectValueForTableColumn:row: fuente de datos. Esto incluirá la célula que tiene que desactivar. Sus necesidades de controlador para suministrar el valor apropiado para la célula.

Si necesita más control de la célula, se puede implementar el método delegado ‑tableView:willDisplayCell:forTableColumn:row:. Esto se llama justo antes de mostrar una célula, y se puede modificar la celda apropiada.

Más información sobre el uso de fuentes de datos se encuentra en los docs .

La otra opción (en lugar de utilizar una fuente de datos) es el uso de enlaces de cacao y un NSArrayController que se unen a su colección de objetos del modelo. En ese caso, se puede obligar a la unión de la columna de la tabla para una propiedad del objeto modelo que controla el estado de los teléfonos habilitados Enabled. Es su responsabilidad asegurarse de que el estado de esa propiedad es correcta.

Si necesita hacer depender la propiedad en el valor de otra propiedad, se puede utilizar el mecanismo dependiente de la clave se indica en el documentación de valor-clave de Observación .

Otros consejos

¿Podría unen la capacidad de edición de esa columna con el valor que se está mostrando en la casilla de verificación? es decir, si se comprueba, es editable, de lo contrario, no lo es?

Estoy tratando de recordar la interfaz del editor exacta, y no estoy junto a mi Mac en casa, así que no soy capaz de hacer una caminata total a través de ella -. Espero que esto le puede apuntar en la dirección correcta

Desde SDK Versión 10.7, hay -viewAtColumn:row:makeIfNecessary: en NSTableView. La mayoría de la información que encontré en la web no tome los nuevos métodos en cuenta, por lo que aquí es para todos los demás en busca de una respuesta a esta pregunta.

Desde el evento de ratón a células Selección

En primer lugar, añadir un protocolo para su controlador para la selección de células mango de una vista de tabla, como esto:

@protocol XYZCellSelectionDelegate <NSObject>
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column;
@end

Entonces NSTableView subclase y -mouseDown: override

// In your Custom Table View subclass:
- (void)mouseDown:(NSEvent *)event
{
    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
    NSInteger selectedRowIndex = [self rowAtPoint:point];
    NSInteger selectedColumnIndex = [self columnAtPoint:point];

    if ([self.calendarViewDelegate respondsToSelector:@selector(cellViewWasSelectedAtRow:column:)])
    {
        [self.calendarViewDelegate cellViewWasSelectedAtRow:selectedRowIndex column:selectedColumnIndex];
    }

    [super mouseDown:event];
}

A continuación, puede utilizar -viewAtColumn:row:makeIfNecessary: así en el objeto delegado / controlador:

- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column
{
    NSView *selectedView = [self.tableView viewAtColumn:column row:row makeIfNecessary:YES];

    // Do something with the cell to the right
    NSInteger nextColumn = column + 1;
    NSView *cellNextToIt = [self.calendarTableView viewAtColumn:nextColumn row:row makeIfNecessary:YES];

}

Nota:. Hoy en día, me lo pase la vista de tabla al delegado como un parámetro en lugar de depender de la delegada para mantener una referencia a la vista de tabla

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top