cocoa nstableview

cocoa - Colorear filas en la vista basada en NSTableview



(4)

Finalmente funcionó como abajo.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { NSView *cellView = (NSView*) [tableView makeViewWithIdentifier:[tableColumn identifier] owner:[tableView delegate]]; CALayer *viewLayer = [CALayer layer]; [viewLayer setBackgroundColor:[[NSColor redcolor] CGColor]]; [cellView setWantsLayer:YES]; [cellView setLayer:viewLayer]; return cellView; }

Tenga en cuenta ... necesita convertir nscolor a cgcolor que puede encontrar en https://gist.github.com/707921 o http://forrst.com/posts/CGColor_Additions_for_NSColor-1eW

Tengo una vista basada en nstableview. Quiero colorear toda la fila en función de algunas condiciones para las que he utilizado el código siguiente

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row { NSTableRowView *view = [[NSTableRowView alloc] initWithFrame:NSMakeRect(1, 1, 100, 50)]; [view setBackgroundColor:[NSColor redColor]]; return view;; }

Se llama al método delegado, pero la tabla no parece estar usando NSTableRowView devuelto por el método delegado.

El objetivo principal aquí es colorear toda la fila en función de alguna condición. ¿Qué está mal en la implementación anterior?


Para cualquier otra persona que golpee esto y quiera un fondo de fondo NSTableRowView personalizado, hay dos enfoques.

  1. Si no necesita un dibujo personalizado, simplemente configure rowView.backgroundColor en - (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row en su NSTableViewDelegate .

    Ejemplo:

    - (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row { rowView.backgroundColor = [NSColor redColor]; }

  2. Si necesita un dibujo personalizado, cree su propia subclase NSTableRowView con el drawRect deseado. Luego, implemente lo siguiente en NSTableViewDelegate :

    Ejemplo:

    - (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row { static NSString* const kRowIdentifier = @"RowView"; MyRowViewSubclass* rowView = [tableView makeViewWithIdentifier:kRowIdentifier owner:self]; if (!rowView) { // Size doesn''t matter, the table will set it rowView = [[[MyRowViewSubclass alloc] initWithFrame:NSZeroRect] autorelease]; // This seemingly magical line enables your view to be found // next time "makeViewWithIdentifier" is called. rowView.identifier = kRowIdentifier; } // Can customize properties here. Note that customizing // ''backgroundColor'' isn''t going to work at this point since the table // will reset it later. Use ''didAddRow'' to customize if desired. return rowView; }


Reescribí el enfoque de la capa. En Swift 3.2

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { let greenCell = self.tableview.make(withIdentifier: "green", owner: self) let layer:CALayer = CALayer() layer.backgroundColor = NSColor.green.cgColor greenCell?.wantsLayer = true greenCell?.layer = layer return greenCell }

No olvide cambiar el identificador de la celda de acuerdo con su guión gráfico y en el identificador de código "verde". Y seguramente, el color de fondo si quieres.


Si ve la presentación en vistas de tabla basadas en vistas de WWDC 2011, verá que la idea principal es crear las vistas en Interface Builder y luego obtenerlas desde allí. Algo como:

[tableView makeViewWithIdentifier:@"GroupRow" owner:self];

Una vez que haya obtenido la vista, simplemente configure sus propiedades y devuélvala.

Observe en este ejemplo que tiene su propio identificador, así que recuerde establecerlo, pero también puede usar identificadores automáticos.

No sé si un enlace directo a la WWDC funcionará, pero la página principal está aquí: https://developer.apple.com/videos/wwdc/2011/ y si busca "View Based NSTableView Basic to Advanced ", lo encontrarás. Vale la pena verlo.