Question

J'ai NSCell personnalisée avec le code suivant pour afficher une NSColorPanel quand il est cliqué:

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

Cependant, ce code affiche un sélecteur de couleurs, lorsque je clique sur une couleur, il se bloque. Si si retirer le [panneau setTarget: auto]. Ligne, il fonctionne très bien, mais sans effet (parce que je ne reçois jamais la valeur de couleur car il n'y a pas de cible)

Voici la trace de la pile. L'erreur est 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)
Était-ce utile?

La solution

Vous devez poster la partie pertinente des rapports d'erreur / sorties de débogage; sinon, il est difficile de deviner exactement ce qui a mal tourné! Nous ne sommes pas clairvoyants, vous savez. Le rapport contient des informations précieuses accident pourquoi il est écrasé.

Cela dit, il est un open-source couleur bien cellule href="http://ringce.com/code/Cocoa/lvcolorwellcell" disponibles . Il est seulement pour l'application compatible GC, mais devrait être un bon point de départ pour construire sur, si la licence de ce code correspond à votre utilisation. Ne pas réinventer la roue.


laissez-moi ajouter quelques mots. NSCell dans un NSTableView est utilisé comme timbre pour dessiner des entrées pour chaque ligne et est généralement réutilisée, et ce n'est pas un NSCell pour chaque ligne est générée. Cela ne fait pas beaucoup de sens du point de vue actuel de la mémoire abondante dans un système, mais il était logique il y a 15 ans quand NeXTstep a été conçu.

Quoi qu'il en soit, à cause de cette raison, il est généralement pas une bonne idée pour une cellule à se fixer comme objectif d'un autre objet, car cette cellule tend à ne pas persister. Je suppose que ce qui est à l'origine de cette collision, à savoir NSTableColumn avaient déjà sorti la cellule parce qu'il a terminé en utilisant cette cellule particulière. Il est généralement plus sûr d'avoir une classe de contrôleur comme la cible du panneau, et non la cellule elle-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top