Domanda

Ho un personalizzato NSCell con il seguente codice per visualizzare un NSColorPanel quando si fa clic:

-(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;
}

Questo codice visualizza un selettore di colori, tuttavia, quando si fa clic su un colore, si blocca. Se se rimuovere il [Pannello setTarget: self]. La linea, allora funziona bene, anche se con nessun effetto (perché non ho mai ricevere il valore del colore in quanto non v'è alcun obiettivo)

Questa è la traccia dello stack. L'errore è 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)
È stato utile?

Soluzione

È necessario inviare la parte rilevante delle uscite di crash report / debugger; in caso contrario, è difficile indovinare esattamente cosa è andato storto! Non siamo sensitivi, si sa. Il rapporto contiene informazioni preziose incidente il motivo per cui si è schiantato.

Detto questo, c'è un open-source colore ben cellulare a disposizione qui . E 'solo per applicazione GC-enabled, ma dovrebbe essere un buon punto di partenza su cui costruire, se la licenza di tale codice si adatta al vostro utilizzo. Non re-inventare la ruota.


mi permetta di aggiungere qualche parola. NSCell in NSTableView viene utilizzato come provvisorie per disegnare voci per ogni riga e tipicamente viene riutilizzato, e non è che un NSCell per ogni riga viene generato. Questo non ha molto senso dal punto di vista attuale con la memoria abbondante in un sistema, ma aveva un senso 15 anni fa, quando NeXTStep è stato progettato prima.

Comunque, per questa ragione, non è in genere una buona idea per una cella a porsi come obiettivo di un altro oggetto, perché tale cella non tende a persistere. Credo che questo è ciò che sta causando questo incidente, vale a dire NSTableColumn avevano già rilasciato il cellulare perché è finito con quella particolare cella. E 'generalmente più sicuro di avere una classe controller come destinazione del pannello, non è la cellula stessa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top