У меня что-то действительно странное: метод вызывает 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, в первый раз ничего не происходит. Это делает его еще более странным.
'([self bounds]). Размер. Ширина' - Argh, почему бы не' self.bounds.size.width'? – 2013-03-11 17:55:56
Или: 'CGRectGetWidth (self.bounds)'. – Adam
@ H2CO3 Извините, я прототипировал этот код на машине с Objective-C 1 ... Но я думаю, что я уже нашел проблему (еще не протестирован): я установил цвет для ключа 'NSFontAttributeName'. NSString смотрит значение для 'NSFontAttributeName', думает, что это NSFont (но это NSColor). Следовательно, непризнанный селектор. Выход ошибки блокирует поток stdout для моего оператора NSLog(). Но это все непроверено. Я оставлю здесь вопрос, чтобы другие люди могли видеть код; он может иметь несколько проблем. – 11684