0

我在一个控制器中共享了 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)sender 中的错误,所以我设置了断点。但是当我更改背景颜色时,并没有调用changeAttributes,所以没关系。

4

1 回答 1

1

问题只能定位,-[DesktopController updateCellBackgroundColor:]因为似乎这是在选择颜色时被调用的一个地方。由于无法访问此代码,我无法告诉您它如何更改您的模型。

一些额外的注释和建议:

  • isFontPanel变量有什么用?NSColorPanelNSFontPanel采取足以区分的动作选择器。
  • 不要在 getter by 前加上前缀get,这不符合 Cocoa 约定,如果您使用键值编码/观察,很可能会失败。
  • 您的控制器正在访问另一个控制器的内部,这会破坏面向对象。您应该在 上定义方法DesktopController,而不是直接更改其状态。
  • 同样,更改 NSTextView 的 NSAttributedString 存储的属性实际上属于您的域模型。
于 2013-05-12T09:57:55.577 回答