2013-03-11 2 views
2

У меня что-то действительно странное: метод вызывает unrecognized selector sent to instance, но не NSLog() ничего вообще.NSString drawInRect: withAttributes: вызывает «непризнанный селектор, отправленный экземпляру ...»

Я сделал пользовательский NSControl подкласс, где я пытаюсь сделать мои собственные клетки, как это:

- (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' 

As вы можете увидеть MKMenuCell's drawWithFrame:inView:. но вывод из его инструкции NSLog() не отображается. Что здесь происходит? Как его решить?

EDIT: Теперь я понимаю, глядя на выход GDB, в первый раз ничего не происходит. Это делает его еще более странным.

+0

'([self bounds]). Размер. Ширина' - Argh, почему бы не' self.bounds.size.width'? – 2013-03-11 17:55:56

+0

Или: 'CGRectGetWidth (self.bounds)'. – Adam

+0

@ H2CO3 Извините, я прототипировал этот код на машине с Objective-C 1 ... Но я думаю, что я уже нашел проблему (еще не протестирован): я установил цвет для ключа 'NSFontAttributeName'. NSString смотрит значение для 'NSFontAttributeName', думает, что это NSFont (но это NSColor). Следовательно, непризнанный селектор. Выход ошибки блокирует поток stdout для моего оператора NSLog(). Но это все непроверено. Я оставлю здесь вопрос, чтобы другие люди могли видеть код; он может иметь несколько проблем. – 11684

ответ

7

Плохой селектор, отправленный screenFontWithRenderingMode, является методом NSFont. Я уверен, что вы не должны устанавливать цвет для значения ключа NSFontAttributeName. Вероятно, вы должны дать ему шрифт.

+0

Я уже заметил, что (см. Мой комментарий к вопросу), но оставил вопрос здесь, потому что я не был уверен, что это была единственная проблема. – 11684

+0

@ 11684: Дело не в том, что проблема «блокирует поток stdout для моего оператора NSLog()»; это то, что он вызывает исключение, которое заканчивает выполнение вашего кода и возвращает ваше приложение обратно в самый внутренний цикл цикла (или, в некоторых случаях, завершает его полностью). Ваш внутренний метод не продвинулся дальше вашей попытки 'drawInRect: withAttributes:'; ваш внешний метод только вступил в цикл один раз. Исправляя исключение (не помещая цвет, где ожидается шрифт), будет исправлен цикл. –

+0

Ну, вы ошибаетесь (это звучит грубо, но это не значит, я не являюсь носителем английского языка). Цикл запускается дважды (поскольку первое значение в массиве равно nil, другая проблема с кодом), а инструкция NSLog находится перед строкой, которая выдает ошибку. Я думаю, что 'stdout' Buffers это, а затем' stderr' вставляет. После этого приложение завершается, не смывая буфер 'stdout'. – 11684

Смежные вопросы