首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个控制器中的共享NSColorPanel

一个控制器中的共享NSColorPanel
EN

Stack Overflow用户
提问于 2013-05-12 09:00:30
回答 1查看 745关注 0票数 0

我在一个控制器中共享了NSControlPanel。我正在将颜色更改为我的NSTextView背景和文本前景色。但是,当我在面板中更改背景颜色时,文本颜色也会自动更改。问题出在哪里?请回答!

代码语言:javascript
复制
- (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还没有被调用,所以没关系。

EN

回答 1

Stack Overflow用户

发布于 2013-05-12 09:57:55

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

以下是一些补充说明和建议:

  • isFontPanel变量的优点是什么?NSColorPanelNSFontPanel采用了一个动作选择器,这足以区分这两个变量。
  • 不要用get作为前缀,这不符合Cocoa约定,而且如果使用键值编码/观察,很可能会失败。
  • 您的控制器正在访问另一个控制器的内部,该控制器破坏了面向对象。您应该在DesktopController上定义方法,而不是直接更改其状态。
  • 同样,更改NSAttributedString存储的NSTextView属性实际上属于您的域模型。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16505741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档