2013-05-12 3 views
0

Я поделился NSControlPanel в одном контроллере. Я меняю цвет на свой фон NSTextView и цвет переднего плана текста. Но когда я меняю цвет на панели для фона, цвет текста также был изменен автоматически. Где проблема? Thx для ответа!Общая NSColorPanel в одном контроллере

- (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]]; 
    } 
} 
} 

Я думал, что это была ошибка (недействительных) changeAttributes: (идентификатор) отправителя, так что я установить точку останова. Но когда я меняю цвет фона, changeAttributes не вызывается, поэтому все в порядке.

ответ

1

Проблема может быть найдена только в -[DesktopController updateCellBackgroundColor:], так как кажется, что это одно место, которое вызывается при выборе цвета. Без доступа к этому коду я не могу сказать, как он изменяет вашу модель.

Несколько дополнительных примечаний и предложений:

  • Что такое isFontPanel переменная хорошо? NSColorPanel и NSFontPanel возьмите селектор действий, которого достаточно, чтобы провести различие.
  • не префикс вы получаете по get, это не соответствует соглашениям о какао и, скорее всего, не сработает, если вы используете кодирование/наблюдение по ключевым словам.
  • ваш контроллер обращается к внутренним устройствам другого контроллера, который побеждает ориентацию объекта. Вы должны определить методы на DesktopController, вместо того чтобы напрямую изменять его состояние.
  • Аналогичным образом, изменение атрибутов хранилища NSAttributedString в NSTextView фактически относится к вашей модели домена.
+0

Thx за советы! updateCellBackgroundColor: выглядит следующим образом: - (Недействительными) updateCellBackgroundColor: (NSColor *) BackgroundColor { [self.startCell setBackgroundColor: BackgroundColor]; [self.startCell setNeedsDisplay: YES]; } isFontPanel является переменной для распознавания, если NSPanel является NSColorPanel или NSFontPanel, который содержит другую NSColorPanel. –

Смежные вопросы