0

1 つのコントローラーで 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適していますか?NSColorPanel区別するのにNSFontPanel十分なアクションセレクターを使用します。
  • gettergetの前に を付けないでください。これは Cocoa の規則に従っておらず、キー値のコーディング / 監視を使用すると失敗する可能性が最も高くなります。
  • コントローラーが別のコントローラーの内部にアクセスしているため、オブジェクト指向が無効になっています。DesktopController状態を直接変更するのではなく、 でメソッドを定義する必要があります。
  • 同様に、NSTextView の NSAttributedString ストレージの属性を変更すると、実際にはドメイン モデルに属します。
于 2013-05-12T09:57:55.577 に答える