Общий NSColorPanel в одном контроллере
Я поделился NSControlPanel в одном контроллере. Я меняю цвет на свой фон NSTextView и цвет текста на переднем плане. Но когда я меняю цвет на панели для фона, цвет текста тоже менялся автоматически. Где проблема? Спасибо за ответ!
- (IBAction)showColorPanel:(id)sender {
NSColorPanel *panel = [NSColorPanel sharedColorPanel];
[panel orderFront:nil];
[panel setAction:@selector(changeColorForBackground:)];
[panel setTarget:self];
[panel makeKeyAndOrderFront:self];
isFontPanel = NO;
}
- (void)changeColorForBackground:(id)sender {
if (!isFontPanel) {
DesktopController *desktopController = [self getDesktopController];
[desktopController updateCellBackgroundColor:[sender color]];
}
}
#pragma mark - font+color
- (IBAction)showFontPanel:(id)sender {
DesktopViewText *dvt = (DesktopViewText *)[[[self getDesktopController] startCell] subcell];
NSFontPanel *panel = [NSFontPanel sharedFontPanel];
NSFontManager *manager = [NSFontManager sharedFontManager];
if (dvt) {
[manager setSelectedFont:[[dvt label] font] isMultiple:NO];
}
[panel orderFront:nil];
[manager setAction:@selector(changeFont:)];
[manager setTarget:self];
isFontPanel = YES;
}
- (void)changeFont:(id)sender {
DesktopViewText *dvt = (DesktopViewText *)[[[self getDesktopController] startCell] subcell];
if (dvt) {
NSFont *oldFont = [dvt font];
NSFont *newFont = [sender convertFont:oldFont];
[[dvt textStorage] addAttribute:NSFontAttributeName value:newFont range:[dvt selectedRange]];
}
}
- (void)changeAttributes:(id)sender {
if (isFontPanel) {
DesktopViewText *dvt = (DesktopViewText *)[[[self getDesktopController] startCell] subcell];
if (dvt) {
NSDictionary *oldAttributes = [[dvt textStorage] fontAttributesInRange:[dvt selectedRange]];
NSDictionary *newAttributes = [sender convertAttributes: oldAttributes];
[[dvt textStorage] setAttributes:newAttributes range:[dvt selectedRange]];
//[[dvt textStorage] addAttribute:NSForegroundColorAttributeName value:[newAttributes ] range:[dvt selectedRange]];
}
}
}
Я думал, что это ошибка в (void)changeAttributes:(id) отправителя, поэтому я установил точку останова. Но когда я меняю цвет фона, changeAttributes не вызывался, так что все в порядке.
1 ответ
Проблема может быть найдена только в -[DesktopController updateCellBackgroundColor:]
так как кажется, это единственное место, которое вызывается при выборе цвета. Не имея доступа к этому коду, я не могу сказать вам, как он меняет вашу модель.
Пара дополнительных замечаний и предложений:
- что
isFontPanel
переменная хороша для?NSColorPanel
а такжеNSFontPanel
принять действие селектора, которого достаточно, чтобы сделать различие. - не префикс вы получите
get
это не соответствует соглашениям Какао и, скорее всего, приведет к сбою, если вы используете кодирование / наблюдение значения ключа. - ваш контроллер обращается к внутренним объектам другого контроллера, который нарушает ориентацию объекта. Вы должны определить методы на
DesktopController
вместо непосредственного изменения своего состояния. - аналогично, изменение атрибутов хранилища NSAttributedString NSTextView фактически принадлежит вашей доменной модели.