2016-12-28 1 views
1

그래서 내 경로를 그려야하는 데이터로 알림을받습니다. 이 코드는 내 메인 컨트롤러에서 가져온 것입니다 :내 NSBezierPath가 표시되지 않는 이유는 무엇입니까?

-(void) handleAdd:(NSNotification *)aNotification{ 
NSLog(@"x1:%f y1:%f x2:%f y2:%f ",[panelController x1],[panelController y1],[panelController x2],[panelController y2]); 

myPath = [[NSBezierPath alloc]init]; 
[myPath setLineWidth:[panelController grosor]]; 

[myPath moveToPoint:NSMakePoint([panelController x1],[panelController y1])]; 
[myPath lineToPoint:NSMakePoint([panelController x2],[panelController y2])]; 
[[panelController trazado] setStroke]; 
[myPath stroke]; 
} 

NSLog가 올바른 데이터를 보여줍니다. 나는보기를 만들었고 그 하얀 사각형 안에 내가 그리고 싶은 곳이있다.

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
     } 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSRect bounds= [self bounds]; 
    [[NSColor whiteColor] set]; 
    [NSBezierPath fillRect:bounds]; 
} 

내가 그 클래스를 그려 보면 스트로크가 표시되지만 어떻게 컨트롤러에서 그 뷰를 그릴 수 있습니까? 아니면 그냥보기에서 알림을 받아 해당 클래스에서 가져와야합니까?

+0

모든 도면은'-drawRect :'안에 있어야합니다. 따라서'-handleAdd :'는 데이터를 저장하고보기에 플래그를 표시한다 :'[myView setNeedsDisplay : YES];'. 마지막으로 베 지어 패스의 색상을 설정해야합니다. –

답변

4

컨트롤러에서보기로 (쉽게) 그릴 수 없습니다.

새로 고침 할 때마다 무엇을 그리는 지 완전한 지침 집합으로보기 drawRect을 생각해보십시오.

그래서 지금 당신이 말하는 모든 당신의 의견 drawRect: 메서드 내에서 모든 관련 도면을 처리 할 필요가

을 "흰색 나를 채우기"입니다.

컨트롤러 방법을 다음과 같이 조정하십시오.

-(void) handleAdd:(NSNotification *)aNotification{ 
    [myViewInstance setNeedsDisplay:YES]; //also myViewInstance.needsDisplay = YES 
} 

그리고보기를 가정하면 패널 컨트롤러에 대한 참조가

... 당신이 NSViewlockFocus/unlockFocus 방법에보고 할 첫 번째 기술을 탐구하려는 경우

@interface MyView: UIView 

//weak as you don't want a reference cycle 
@property (weak) MyPanelController *panelController; 

@end 

@implementation MyView 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSRect bounds= [self bounds]; 
    [[NSColor whiteColor] set]; 
    [NSBezierPath fillRect:bounds]; 

    NSBezierPath *myPath = [[NSBezierPath alloc]init]; 
    [myPath setLineWidth:[self.panelController grosor]]; 

    [myPath moveToPoint:NSMakePoint([self.panelController x1],[self.panelController y1])]; 
    [myPath lineToPoint:NSMakePoint([self.panelController x2],[self.panelController y2])]; 
    [[self.panelController trazado] setStroke]; 
    [myPath stroke]; 
} 

@end 

. 문서에서 왜이 작업을 원하지 않는지 설명합니다.

+0

나는 그것을 지금 얻는다. 그러나 모든 새로 고침과 함께 그것이 하얀으로 fillrect를 할 것이면, 당신이 가지고 있었던 형체는 지나갈 것이냐? 그리고 앱을 실행할 때 myPath에서 그릴 내용이 없을 것입니다. 맞습니까? 나는 그것을 제어해야 하는가? –

+0

그리고 한 가지 더, 내가보기에서 패널에 대한 참조가 없다면 어떻게 할 수 있습니까? –

+0

당신은'panelController'에 대한 참조를 전달하거나 모델을 설정하고 그것을 사용함으로써 그 정보를 그릴 수 있도록 관련 정보를 뷰에 전달하는 방법을 찾아야합니다. 현재 도면은 첨가제가 아닌 정확히 한 번만 사용됩니다. 그릴 선이 10 개인 경우 매주기마다 모두 그려야합니다. –

관련 문제