Frage

Ich habe eine benutzerdefinierte NSCell mit dem folgenden Code, um ein Nscolorpanel anzuzeigen, wenn er geklickt wird:

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

Dieser Code zeigt jedoch einen Farbwähler an, wenn ich auf eine Farbe klicke, stürzt er ab. Wenn Sie die [Panel Settarget: Self] -Linie entfernen, funktioniert es einwandfrei, wenn auch ohne Wirkung (weil ich den Farbwert nie bekomme, da es kein Ziel gibt).

Hier ist die Stapelspur. Der Fehler ist 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)
War es hilfreich?

Lösung

Sie müssen den relevanten Teil der Absturzberichte/Debugger -Ausgänge veröffentlichen. Ansonsten ist es schwer zu erraten, was schief gelaufen ist! Wir sind keine Hellseher, weißt du? Der Crash -Bericht enthält wertvolle Informationen, warum er abgestürzt ist.

Das heißt, es gibt eine Open-Source-Farb-Well-Zelle hier. Es ist nur für die GC-fähige App, sollte aber ein guter Start sein, wenn die Lizenz dieses Code zu Ihrer Verwendung passt. Erfinden Sie das Rad nicht erneut.


Lassen Sie mich ein paar Worte hinzufügen. NSCell in einem (n NSTableView wird als Stempel Einträge für jede Zeile zu zeichnen und normalerweise wiederverwendet, und es ist nicht so ein NSCell für jede Zeile wird erzeugt. Dies macht aus aktueller Sicht nicht viel Sinn in einem System, aber es machte vor 15 Jahren Sinn, als NextStep zum ersten Mal entworfen wurde.

Auf jeden Fall ist es aus diesem Grund nicht eine gute Idee für eine Zelle, sich als Ziel eines anderen Objekts zu setzen, da diese Zelle dazu neigt, nicht zu bestehen. Ich denke, das verursacht diesen Absturz, dh NSTableColumn hatte die Zelle bereits freigegeben, weil sie mit dieser bestimmten Zelle fertig war. Es ist im Allgemeinen sicherer, eine Controller -Klasse als Ziel des Panels zu haben, nicht als Zelle selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top