Pregunta

Tengo una costumbre NSCell con el siguiente código para mostrar una NSColorPanel cuando se hace clic en:

-(void)setColorFromPanel:(NSColorPanel*)panel{
 NSLog(@"COLOR is HERE!");
 [self setObjectValue:[panel color]];
}

- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView{
 if(self.isColor){
  if([event type]==NSLeftMouseDown){
   NSColorPanel *panel=[NSColorPanel sharedColorPanel];
   [panel setColor:[self objectValue]];
   [panel setShowsAlpha:YES];
   [panel setAction:@selector(setColorFromPanel:)];
   [panel setTarget:self];
   [panel makeKeyAndOrderFront:nil];
  }
  return NSCellHitContentArea;
 }
    return NSCellHitNone;
}

Este código muestra un selector de color, sin embargo, cuando hago clic en un color, que se estrelle. Si si quitar el [setTarget panel de: auto]. Línea, entonces funciona bien, aunque sin efecto (porque no recibo el valor de color ya que no hay objetivo)

Aquí está el seguimiento de la pila. El error es EXC_BAD_ACCESS.

#0  0x00007fff8667811c in objc_msgSend ()
#1  0x00007fff87081e9a in -[NSApplication sendAction:to:from:] ()
#2  0x00007fff871fa1cd in -[NSColorPanel _forceSendAction:notification:firstResponder:] ()
#3  0x00007fff871fe384 in -[NSColorPanel setColor:] ()
#4  0x00007fff8721d112 in -[NSColorPickerWheel setColor:] ()
#5  0x00007fff8721d5ae in -[NSColorPickerWheel brightnessSlider:] ()
#6  0x00007fff87081e9a in -[NSApplication sendAction:to:from:] ()
#7  0x00007fff87081df9 in -[NSControl sendAction:to:] ()
#8  0x00007fff8710d400 in -[NSCell trackMouse:inRect:ofView:untilMouseUp:] ()
#9  0x00007fff873eaf01 in -[NSSliderCell trackMouse:inRect:ofView:untilMouseUp:] ()
#10 0x00007fff8710c215 in -[NSControl mouseDown:] ()
#11 0x00007fff8702634f in -[NSWindow sendEvent:] ()
#12 0x00007fff86f5ba86 in -[NSApplication sendEvent:] ()
#13 0x00007fff86ef24da in -[NSApplication run] ()
#14 0x00007fff86eeb1a8 in NSApplicationMain ()
#15 0x00000001000029bb in main (argc=1, argv=0x7fff5fbff6a0)
¿Fue útil?

Solución

Es necesario para colocar la parte pertinente de los informes salidas de choque / depurador; de lo contrario, es difícil de adivinar exactamente lo que salió mal! No estamos psíquicos, ya sabes. El informe de error contiene información valiosa por la que se estrelló.

Dicho esto, no es un código abierto de color así celulares disponibles href="http://ringce.com/code/Cocoa/lvcolorwellcell" aquí . Es sólo para aplicación habilitada para GC, pero debe ser un buen punto de partida para construir sobre, si la licencia de código que se adapte a su uso. No reinventar la rueda.


permítanme añadir unas pocas palabras. NSCell en un NSTableView se utiliza como un sello para sacar entradas para cada fila y normalmente se vuelve a utilizar, y no es que se genera una NSCell para cada fila. Esto no tiene mucho sentido desde el punto de vista de abundante memoria en un sistema actual, pero tenía sentido hace 15 años cuando NeXTStep fue diseñado en primer lugar.

De todos modos, debido a esta razón, no es generalmente una buena idea para una célula de configurarse como un objetivo de otro objeto, debido a que las células no tiende a persistir. Supongo que eso es lo que está causando este accidente, es decir NSTableColumn ya se habían liberado de la célula, ya que dejó de utilizar esa célula en particular. Por lo general es más seguro tener una clase de controlador ya que el objetivo del panel, no la propia célula.

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