我有一个具有以下代码的自定义NSCELL,可以单击NSCOLORPANEL:

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

此代码显示颜色选择器,但是,当我单击颜色时,它会崩溃。如果删除[面板settarget:self]行,则可以正常工作,尽管没有效果(因为我从未收到颜色值,因为没有目标)。

这是堆栈跟踪。错误是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)
有帮助吗?

解决方案

您需要发布崩溃报告/调试器输出的相关部分;否则,很难确切地猜测出了什么问题!您知道,我们不是心理学家。崩溃报告包含有价值的信息为什么崩溃。

也就是说,有一个开源的色孔单元 这里. 。它仅适用于启用GC的应用程序,但如果该代码的许可符合您的使用情况,则应该是一个很好的开始。不要重新发明轮子。


让我添加几句话。 NSCellNSTableView 被用作 邮票 要为每一行绘制条目,通常是重复使用的,而不是 NSCell 对于每行都是生成的。从当前的角度来看,这在系统中具有丰富的内存并没有多大意义,但是15年前,当NextStep首次设计时,这是有意义的。

无论如何,因此,由于这个原因,对于单元格,将自己设置为另一个对象的目标并不是一个好主意,因为该单元格往往不会持久。我想那是导致这次崩溃的原因,即 NSTableColumn 已经发布了该单元,因为它使用该特定单元格完成了。通常,将控制器类作为面板的目标,而不是单元格本身是更安全的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top