Общий 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 фактически принадлежит вашей доменной модели.
Другие вопросы по тегам