2013-05-12 4 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]]; 
    } 
} 
} 

(void) changeAttributes :(id) 보낸 사람에게 오류가있어 중단 점을 설정했다고 생각했습니다. 하지만 배경색을 변경하면 changeAttributes가 호출되지 않았으므로 괜찮습니다.

답변

1

이 문제는 색상을 가져 왔을 때 호출되는 곳이기 때문에 -[DesktopController updateCellBackgroundColor:]에만 위치 할 수 있습니다. 이 코드에 액세스 할 수 없기 때문에 모델 변경 방법을 알 수 없습니다.

  • 가에 대한 isFontPanel 변수 좋은 것입니다 :

    추가 참고 사항 및 제안의 몇

    ? NSColorPanelNSFontPanel은 구별하기에 충분한 액션 선택기를 사용합니다.
  • getter 앞에 get이 붙지 않아 코코아 규칙을 따르지 않고 키 값 코딩/관찰을 사용하면 실패 할 가능성이 가장 큽니다.
  • 귀하의 컨트롤러가 다른 컨트롤러의 내부에 액세스하고있어 객체 ​​지향을 무효화합니다. 상태를 직접 변경하지 말고 DesktopController에 메소드를 정의해야합니다.
  • 마찬가지로 NSTextView의 NSAttributedString 저장소 속성을 변경하는 것은 실제로 도메인 모델에 속합니다.
+0

조언을위한 Thx! updateCellBackgroundColor : 모양은 다음과 같습니다. - (void) updateCellBackgroundColor : (NSColor *) backgroundColor { [self.startCell setBackgroundColor : backgroundColor]; [self.startCell setNeedsDisplay : YES]; } isFontPanel은 NSPanel이 NSColorPanel이거나 다른 NSColorPanel이 포함 된 NSFontPanel 인 경우 인식 할 수있는 변수입니다. –