Вопрос
У меня есть пользовательский 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)
Решение
Вам нужно опубликовать соответствующую часть отчетов о сбоях/выходов отладчиков; В противном случае трудно угадать, что именно пошло не так! Мы не экстрасенсы, вы знаете. Отчет об аварии содержит ценную информацию, почему она разбилась.
Тем не менее, есть ячейка с открытым исходным кодом. здесь. Анкет Это только для приложения с поддержкой GC, но должно быть хорошим началом, если лицензия этого кода соответствует вашему использованию. Не повторно изобретайте колесо.
Позвольте мне добавить несколько слов. NSCell
в NSTableView
используется как печать рисовать записи для каждого ряда и обычно используется повторно, и это не так NSCell
Для каждой строки генерируется. Это не имеет большого смысла с текущей точки зрения с обильной памятью в системе, но это имело смысл 15 лет назад, когда NextStep был впервые разработан.
В любом случае, по этой причине, для ячейки, как правило, не очень хорошая идея, чтобы установить себя как цель другого объекта, потому что эта ячейка имеет тенденцию не сохраняться. Я думаю, это то, что вызывает этот аварий, т.е. NSTableColumn
уже выпустил ячейку, потому что закончила использование этой конкретной ячейки. Как правило, безопаснее иметь класс контроллера в качестве цели панели, а не самой ячейки.