2013-03-11 10 views
2

뭔가 이상한 점이 있습니다. 메서드가 unrecognized selector sent to instance인데, 전혀 NSLog()이 아닙니다.NSString drawInRect : withAttributes : '인식 할 수없는 셀렉터가 인스턴스로 전송되었습니다.'...

- (void)drawRect:(NSRect)dirtyRect { 
    NSLog(@"DrawRect entered!"); 
    [[NSColor grayColor] set]; 
    [NSBezierPath fillRect:[self bounds]]; 

    unsigned int i, count = [cells count]; 
    NSRect cellRect = NSMakeRect(0, 0, ([self bounds]).size.width, cellHeight); 
    for (i = 0; i < count; i++) { 
     NSLog(@"Drawing cell %d at: %@", i, NSStringFromRect(cellRect)); 
     MKMenuCell *cell = [cells objectAtIndex:i]; 
     [cell drawWithFrame:cellRect inView:self]; 
     cellRect.origin.y += cellHeight; 
    } 
} 

그리고 -[MKMenuCell drawWithFrame:inView:] :

- (void)drawWithFrame:(NSRect)bounds inView:(NSView *)controlView { 
    NSLog(@"-drawWithFrame:inView:"); 
    NSMutableDictionary *strAttribs = [[NSMutableDictionary alloc] init]; 
    [strAttribs setObject:[NSColor blackColor] forKey:NSFontAttributeName]; 
    [name drawInRect:bounds withAttributes:strAttribs]; // "unrecognized selector sent ..." is caused by this method call. 
} 

출력 :

2013-03-11 18:46:54.823 MacOverflow[738:a0f] DrawRect entered! 
2013-03-11 18:46:54.826 MacOverflow[738:a0f] Drawing cell 0 at: {{0, 0}, {176, 30}} 
2013-03-11 18:46:54.826 MacOverflow[738:a0f] -drawWithFrame:inView: 
2013-03-11 18:46:54.827 MacOverflow[738:a0f] Drawing cell 1 at: {{0, 30}, {176, 30}} 
2013-03-11 18:46:54.828 MacOverflow[738:a0f] -drawWithFrame:inView: 
2013-03-11 18:46:54.828 MacOverflow[738:a0f] -[NSCachedWhiteColor screenFontWithRenderingMode:]: unrecognized selector sent to instance 0x100512920 
2013-03-11 18:46:54.829 MacOverflow[738:a0f] An uncaught exception was raised 
2013-03-11 18:46:54.831 MacOverflow[738:a0f] -[NSCachedWhiteColor screenFontWithRenderingMode:]: unrecognized selector sent to instance 0x100512920 
2013-03-11 18:46:54.834 MacOverflow[738:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCachedWhiteColor screenFontWithRenderingMode:]: unrecognized selector sent to instance 0x100512920' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x00007fff88c26784 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x00007fff858ddf03 objc_exception_throw + 45 
    2 CoreFoundation      0x00007fff88c80110 +[NSObject(NSObject) doesNotRecognizeSelector:] + 0 
    3 CoreFoundation      0x00007fff88bf88ef ___forwarding___ + 751 
    4 CoreFoundation      0x00007fff88bf4a38 _CF_forwarding_prep_0 + 232 
    5 AppKit        0x00007fff89afcfae +[NSStringDrawingTextStorage _fastDrawString:attributes:length:inRect:graphicsContext:baselineRendering:usesFontLeading:usesScreenFont:typesetterBehavior:paragraphStyle:lineBreakMode:boundingRect:padding:scrollable:] + 402 
    6 AppKit        0x00007fff896db539 _NSStringDrawingCore + 1588 
    7 MacOverflow       0x00000001000159b7 -[MKMenuCell drawWithFrame:inView:] + 229 
    8 MacOverflow       0x0000000100015f1e -[MKMenuControl drawRect:] + 595 
    9 AppKit        0x00007fff896d6cc5 -[NSView _drawRect:clip:] + 3390 
    10 AppKit        0x00007fff896d5938 -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] + 1325 
    11 AppKit        0x00007fff896d5ca2 -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] + 2199 
    12 AppKit        0x00007fff896d5ca2 -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] + 2199 
    13 AppKit        0x00007fff896d5ca2 -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] + 2199 
    14 AppKit        0x00007fff896d400a -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 767 
    15 AppKit        0x00007fff896d3b2c -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 254 
    16 AppKit        0x00007fff896d03de -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] + 2683 
    17 AppKit        0x00007fff89649c0e -[NSView displayIfNeeded] + 969 
    18 AppKit        0x00007fff89611c3b -[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 1050 
    19 AppKit        0x00007fff896117d2 -[NSWindow orderWindow:relativeTo:] + 94 
    20 AppKit        0x00007fff895dd974 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1726 
    21 AppKiProgram received signal: “SIGABRT”. 
t        0x00007fff895dba91 loadNib + 226 
    22 AppKit        0x00007fff895dafa1 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 248 
    23 AppKit        0x00007fff895dadd9 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 326 
    24 AppKit        0x00007fff895d835b NSApplicationMain + 279 
    25 MacOverflow       0x0000000100000ef9 main + 33 
    26 MacOverflow       0x0000000100000ed0 start + 52 
    27 ???         0x0000000000000001 0x0 + 1 
) 
terminate called after throwing an instance of 'NSException' 

으로

은 내가 이렇게 내 사용자 지정 셀을 그릴려고 사용자 지정 NSControl 서브 클래스를 만들어 MKMenuCelldrawWithFrame:inView:이 호출 된 것을 볼 수 있습니다. NSLog() 문으로부터의 출력은 표시되지 않습니다. 여기서 무슨 일이 일어나고있는거야? 그것을 해결하는 방법?

EDIT : 이제 GDB 출력을 보면 처음에는 아무 것도 잘못되지 않습니다. 이것은 심지어 그것을 낯선 사람으로 만든다.

+0

'([self bounds]). 크기. 폭'- 아, 왜 'self.bounds.size.width'가 아니겠습니까? –

+0

아니면 :'CGRectGetWidth (self.bounds)'. – Adam

+0

@ H2CO3 죄송합니다. Objective-C 1이 설치된 컴퓨터에서이 코드를 프로토 타입했습니다.하지만 이미 문제가 발견 된 것 같습니다. 아직 NSFontAttributeName 키의 색을 설정했습니다. NSString은'NSFontAttributeName'에 대한 값을 찾고, 그것이 NSFont라고 생각합니다 (그러나 NSColor입니다). 따라서 인식 할 수없는 선택자. 오류 출력 내 NSLog() 문을 stdout 스트림을 차단합니다. 그러나 이것은 모두 테스트되지 않았습니다. 여기에 질문을 남겨두기 때문에 다른 사람들이 코드를 볼 수 있습니다. 여러 가지 문제가있을 수 있습니다. – 11684

답변

7

잘못된 선택기가 전송 됨, screenFontWithRenderingMode은 NSFont의 메소드입니다. 나는 당신이 NSFontAttributeName 키의 값을위한 색을 설정해서는 안되기를 바랍니다. 아마 글꼴을 써야합니다.

+0

나는이 문제가 이미 유일한 것인지 확실하지 않았기 때문에 (질문에 대한 내 의견을 참조하십시오.)이 질문을 이미 보았습니다. – 11684

+0

@ 11684 : 문제가 "NSLog() 문의 stdout 스트림을 차단하지 않습니다"; 예외가 발생하여 코드 실행을 끝내고 앱을 가장 안쪽의 실행 루프 (또는 경우에 따라 완전히 종료)로 되돌립니다. 내부 메소드는 시도한 drawInRect : withAttributes :'; 외부 메서드는 루프에 한 번만 입력했습니다. 예외를 수정하면 (글꼴이있는 곳에서 색상을 지정하지 않음으로써) 루프가 수정됩니다. –

+0

글쎄, 네가 틀렸어. (그건 무례한 소리인데, 의미가 없어. 난 영어 원어민이 아니야.) 루프는 두 번 실행됩니다 (배열의 첫 번째 값이 nil이고 코드와 관련된 또 다른 문제이므로). NSLog 문은 오류가 발생한 행 앞에 있습니다. 나는'stdout' 버퍼를 생각하고,'stderr' 버퍼를 꽂는다. 그 후 앱은'stdout'의 버퍼를 플러시하지 않고 종료한다. – 11684