NSColorPanel от NSCell - PullRequest
       10

NSColorPanel от NSCell

0 голосов
/ 21 января 2011

У меня есть пользовательская 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;
}

Этот код отображает палитру цветов, однако, когда я нажимаю на цвет, он вылетает. Если, если удалить строку [panel 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)

1 Ответ

0 голосов
/ 21 января 2011

Вам необходимо опубликовать соответствующую часть отчетов о сбоях / выводах отладчика; в противном случае трудно угадать, что именно пошло не так! Вы знаете, мы не экстрасенсы. Отчет о сбое содержит ценную информацию о причине сбоя.

Тем не менее, здесь доступна ячейка с цветными ячейками с открытым исходным кодом здесь . Это только для приложений с поддержкой GC, но оно должно быть хорошим началом, если лицензия этого кода подходит для вашего использования. Не изобретай велосипед заново.


позвольте мне добавить несколько слов. NSCell в NSTableView используется в качестве штампа для рисования записей для каждой строки и обычно используется повторно, и это не значит, что NSCell для каждой строки генерируется. Это не имеет большого смысла с текущей точки зрения при наличии достаточного объема памяти в системе, но это имело смысл 15 лет назад, когда был разработан NeXTStep.

В любом случае, по этой причине для ячейки обычно не рекомендуется устанавливать себя в качестве цели для другого объекта, потому что эта ячейка не сохраняется. Я предполагаю, что именно это и стало причиной этого сбоя, то есть NSTableColumn уже освободил ячейку, потому что она закончила использовать эту ячейку. Обычно безопаснее иметь класс контроллера в качестве цели панели, а не саму ячейку.

...