首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自NSCell的NSColorPanel

来自NSCell的NSColorPanel
EN

Stack Overflow用户
提问于 2011-01-21 10:04:31
回答 1查看 739关注 0票数 0

我有一个自定义的NSCell,其中包含以下代码,用于在单击NSColorPanel时显示它:

代码语言:javascript
复制
-(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行,那么它可以正常工作,尽管没有效果(因为我从来没有收到颜色值,因为没有target)。

下面是堆栈跟踪。错误是EXC_BAD_ACCESS。

代码语言:javascript
复制
#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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-21 10:26:19

您需要发布崩溃报告/调试器输出的相关部分;否则,很难猜测到底出了什么问题!我们不是通灵者,你知道。崩溃报告包含有价值的信息,为什么它会崩溃。

也就是说,有一个开源的color-well cell可用here。它只适用于支持GC的应用程序,但如果该代码的许可证适合您的使用,则应该是一个很好的开始。不要重复发明轮子。

让我补充几句。NSTableView中的NSCell被用作为每一行绘制条目的戳,通常会被重用,而且并不是为每一行生成一个NSCell。从当前系统中具有丰富内存的角度来看,这没有多大意义,但在15年前NeXTStep首次设计时,这是有意义的。

总之,由于这个原因,一个细胞将自己设置为另一个对象的目标通常不是一个好主意,因为那个细胞往往不会持久。我猜这就是导致崩溃的原因,即NSTableColumn已经释放了该单元,因为它已经完成了对该单元的使用。一般来说,将一个控制器类作为面板的目标,而不是单元格本身,会更安全。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4754743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档